从 php mysql 传输到 PDO_mysql 驱动程序时返回按表分组的结果

问题描述 投票:0回答:1

问题

我正在升级一个旧的 cakephp 1.3 网站以使用 cake 3.x(及更高版本),但它的 sql 调用不会以与以前相同的格式返回结果。更具体地说,蛋糕 1.3 调用按表名称对请求的字段进行分组,但蛋糕 3 则没有(请参见下面的示例)。

理想情况下,我希望 cake 3.0 结果看起来与 cake 1.3 结果相同,这样我就不必对代码进行任何重大更改。

示例

查询:

    $sql =  "SELECT pm.id, pmp.id  
    FROM product_models as pm  
    LEFT JOIN product_model_prices as pmp  
        ON pmp.item = pm.item  
    LIMIT 1";

在蛋糕1.3中: $结果 = $this->ProductModel->query($sql);

    Array(  
          [0] => Array(  
               [pm]  => Array( [id] => 38354 ),  
               [pmp] => Array( [id] => 599874 )  
        )  
    )

在蛋糕3.0中: $result = ConnectionManager::get('default')->execute($sql)->fetchAll('assoc');

    [  
        (int) 0 => [ 'id' => '599874' ]  
    ]

在底层,Cake 1.3 的 query() 方法似乎只是简单地调用以下内容:

$dbConnection->query($sql)
所以我的猜测是这与蛋糕关系不大,而是由 mysql 驱动程序完成的。 Cake 1.3 使用现已失效的 mysql 驱动程序,而 cake 3 使用的是 PDO_mysql。为此,我尝试使用多种不同的获取模式,但似乎没有一个能满足我的需要。

我也短暂地考虑过切换到 mysqli 的想法,但这在 cake 3+ 中似乎不可能。

任何帮助将非常感激。

php mysql cakephp pdo cakephp-1.3
1个回答
0
投票

您的查询的问题是,在结果集中,

pm.id
pmp.id
都将显示为
id
,因此当它们写入关联数组时,第二个值将覆盖第一个值,给出一个数组一个
id
键和值。 Cake 1.3 一定在幕后的某个地方认识到了这种可能性,并对所选择的列进行别名处理以克服该问题。您可以对查询执行类似的操作来部分解决该问题。我不认为你能够得到完全相同的结构,但至少是接近的:

SELECT pm.id AS pm, pmp.id AS pmp
FROM product_models as pm  
LEFT JOIN product_model_prices as pmp  
     ON pmp.item = pm.item  

这将返回一个看起来像这样的数组

[  
    (int) 0 => [ 'pm' => '38354', 'pmp' => '599874' ]  
]

至少具有相同的顶层结构。

请注意,您的查询中有一个

LIMIT
子句,但没有
ORDER BY
子句。这本质上是没有意义的,并且不能保证运行此查询两次将返回相同的结果。请参阅在没有 ORDER BY 的情况下使用 LIMIT 是否安全

© www.soinside.com 2019 - 2024. All rights reserved.