CakePHP 3.8 / CakePHP 4 vs CakePHP 2中的原始SQL查询结果的数组结构

时间:2019-12-20 20:08:05

标签: cakephp cakephp-3.x cakephp-4.x

在CakePHP 4.0发布之后,我们正在考虑将CakePHP 2.x应用程序迁移到3.8或4.0。当前,我们陷入了这个问题:

我们的应用程序有时使用Model::query()方法使用原始SQL语句。


例如,以下 CakePHP 2 代码:

$sql = "SELECT u.id, u.firstname FROM users u, contacts c WHERE u.id = 2 and c.id = u.contact_id";
$u = $this->User->query($sql);  // Or on any other model...
$this->log($u);

返回

Array
(
    [0] => Array
        (
            [u] => Array
                (
                    [id] => 2
                    [firstname] => MyFirstName
                )
            [c] => Array
                (
                    [zip] => 12345
                )

        )
)

当我们尝试使用 CakePHP 3.8

做同样的事情时
$connection = ConnectionManager::get('default');
$sql = "SELECT u.id, u.firstname FROM users u, contacts c WHERE u.id = 1 and c.id = u.contact_id";
$u = $connection->execute($sql)->fetchAll();
$this->log($u);

结果是

Array
(
    [0] => Array
        (
            [0] => 2
            [1] => MyFirstName
            [2] => 12345
        )
)

为了安全地迁移:是否可以使用与CakePHP 2中相同的数组结构使CakePHP 3.8 / 4返回查询结果?

重写语句以使用ORM不是一种选择。上面的示例不是真实的代码-实际的查询更加复杂。

1 个答案:

答案 0 :(得分:1)

the documentation,您应该使用->fetchAll('assoc')。它的输出与Cake 2中的输出并不完全相同,但是至少存在字段名称。