Как я могу создать подзапрос в cakePHP?
Как я могу создать подзапрос в cakePHP с помощью метода find? Например:
SELECT *, (SELECT COUNT(*) FROM table2 WHERE table2.field1 = table1.id) AS count
FROM table1
WHERE table1.field1 = 'value'
!!! table2.field1 = table1.id!!!
2 ответа
Вы можете сделать это одним из двух способов:
1. Используйте $this->Model->query(...)
Это позволяет вам выполнять SQL напрямую, используя запрос, который вы разместили выше, но имейте в виду, что это может сделать ваше приложение довольно хрупким, если бы схема базы данных изменилась. Вероятно, самый быстрый.( Документация)
пример
$this->Model1->query("SELECT * FROM model;");
2. Разделите звонки
Это, вероятно, не так быстро, как вариант 1, но дает возможность разбить ваш запрос на несколько этапов. Вы также вряд ли получите SQL-инъекцию, которая представляет потенциальный риск с вариантом 1.
пример
$model1s = $this->Model1->find
(
'all',
array
(
'conditions' => array('Model1.field1' => 'value')
)
);
foreach($model1s as $model1)
{
$model1['model2_count'] = $this->Model2->find
(
'count',
array
(
'conditions' => array
(
'Model2.field1' => $model1['id']
)
)
);
}
Кроме того, вы можете создать подзапрос, используя ORM Cake. Это будет проще. Пожалуйста, прочитайте CakePHP, извлекающий данные документа
В общем, вы можете использовать buildStatement()
метод DataSource
объект. Вы можете сохранить всю логику, включая нумерацию страниц и т. Д.