После выпуска CakePHP 4.0 мы рассматриваем возможность переноса нашего приложения CakePHP 2.x на версии 3.8 или 4.0. В настоящее время мы застряли с этой проблемой:
Наше приложение использует необработанные операторы SQL, иногда используя Model::query()
метод.
Например, этот код 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 3.8/4 возвращать результаты запроса, используя ту же структуру массива, что и в CakePHP 2?
Переписывать операторы для использования ORM не вариант. Приведенный выше пример не является реальным кодом — настоящие запросы более сложны.