在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不是一种选择。上面的示例不是真实的代码-实际的查询更加复杂。