cakephp 从php mysql转换到PDO_mysql驱动时返回按表分组的结果

mbjcgjjk  于 12个月前  发布在  PHP
关注(0)|答案(1)|浏览(194)

问题

我正在升级一个旧的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+中似乎是不可能的。
任何帮助将非常感谢。

okxuctiv

okxuctiv1#

你的查询的问题是,在结果集中,pm.idpmp.id都将显示为id,因此当它们被写入一个关联数组时,第二个值将覆盖第一个值,给出一个只有一个id键和值的数组。注意,这种行为在任何mysql下都是相同的,mysqli和PDO驱动程序。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子句。这本质上是没有意义的,并且不能保证运行两次此查询将返回相同的结果。请参阅Is it safe to use LIMIT without ORDER BY

相关问题