问题
我正在升级一个旧的cakephp 1.3网站,使用cake 3.x(及更高版本),但是它的sql调用并没有像以前那样返回相同格式的结果。更具体地说,cake 1.3调用了按表名分组请求字段,而cake 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";
字符串
在cake 1.3中:$result = $this->ProductModel->query($sql);
Array(
[0] => Array(
[pm] => Array( [id] => 38354 ),
[pmp] => Array( [id] => 599874 )
)
)
型
在cake 3.0中:$result = ConnectionManager::get('default')->execute($sql)->fetchAll('asphalt');
[
(int) 0 => [ 'id' => '599874' ]
]
型
- 备注:cake 3中缺少的group-by-table是我试图解决的问题。修复它也会修复消失的id。我应该使用一个更简单的例子。
在引擎盖下Cake 1.3的查询()方法似乎只是沿着$dbConnection->query($sql)
的行调用一些东西,所以我的猜测是,这与cake没有太大关系,而是由mysql驱动程序完成的。Cake 1.3使用的是现已失效的mysql driver,而cake 3使用的是PDO_mysql。为此,我尝试使用了许多不同的fetch modes,但没有似乎给了我所需要的给予。
我也曾短暂地考虑过切换到mysqli的想法,但这在cake 3+中似乎是不可能的。
任何帮助将非常感谢。
1条答案
按热度按时间okxuctiv1#
你的查询的问题是,在结果集中,
pm.id
和pmp.id
都将显示为id
,因此当它们被写入一个关联数组时,第二个值将覆盖第一个值,给出一个只有一个id
键和值的数组。注意,这种行为在任何mysql下都是相同的,mysqli和PDO驱动程序。Cake 1.3一定是在引擎盖的某个地方重写了查询,以别名被选择的列来克服这个问题。你可以对你的查询做一些类似的事情来部分解决这个问题。我不认为你能得到完全相同的结构,但至少是接近的东西字符串
这将返回一个类似于
型
其至少具有相同的顶层结构。
请注意,您的查询中有一个
LIMIT
子句,但没有ORDER BY
子句。这本质上是没有意义的,并且不能保证运行两次此查询将返回相同的结果。请参阅Is it safe to use LIMIT without ORDER BY。