Как я могу создать подзапрос в 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 объект. Вы можете сохранить всю логику, включая нумерацию страниц и т. Д.

Другие вопросы по тегам