问题
我正在升级一个旧的 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+ 中似乎不可能。
任何帮助将非常感激。
您的查询的问题是,在结果集中,
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 是否安全。