Поведение Разница между find ('count') и find ('all') cakePHP - PullRequest
0 голосов
/ 15 февраля 2012

У меня странная проблема в CakePHP, где

$this->something->find('count'); 

работает отлично, но

$this->something->find('all'); 

ничего не возвращает (даже пустой массив, любые ошибки или что-нибудь).

edit: оказывается, я получаю ошибку sql: «Ошибка SQL: 1054: неизвестный столбец» - для столбца, который действительно существует. (users.display_name в запросе sql ниже):

SELECT item.id, item.name, item.description, item.user_id, users.display_name FROM item LEFT JOIN users ON (item.user_id = users.id);

Я также пытался использовать findAllBy и paginate (на самом деле я пытаюсь сделать paginate - хотя из того, что я собрал, paginate и find ('all') довольно похожи по функциональности).

Странно то, что find ('all') работает везде - только в этом конкретном контроллере он действует странно. Я не получаю никаких ошибок, просто пустой результат.

Я думаю, что я могу упускать из виду кое-что довольно простое, но любая помощь приветствуется. Спасибо!

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Итак, согласно нашему обсуждению, у вас проблема с виртуальными полями. Взгляните на документацию , а точнее на виртуальные поля и псевдонимы моделей и ограничение виртуальных полей разделы.

Из вашего описания выше, похоже, что у вас есть соединение, указанное в вашем виртуальном поле, которое будет вызывать ошибку, которую вы видите, потому что оно добавит JOIN перед FROM. Если вы настаиваете на использовании виртуального поля, я бы посоветовал вам переписать его, чтобы использовать подзапрос. Убедитесь, что ваш подзапрос возвращает только 1 столбец.

Пример: (http://web -development-blog.co.uk / 2011/03/08 / cakephp-virtual-field-count-another-modeltable / )

public $virtualFields = array(
    'count' => 'SELECT COUNT(*) FROM stacks Stack'
);

В качестве альтернативы вы можете использовать Model::beforeFind, чтобы связать необходимые модели (при необходимости) и изменить параметры запроса.

Если вы не можете понять это, пожалуйста, опубликуйте свою модель, и я вам помогу.

0 голосов
/ 15 февраля 2012

Конкретная проблема, связанная с различием в поведении, заключается в том, что find('count') выполнит базовый запрос COUNT(*) в вашей базе данных, чтобы определить количество строк.

find('all'), однако, выполняет другой запрос, и, если вы используете SQL, который он пытается использовать, он недопустим:

SELECT item.id, item.name, item.description, item.user_id, users.display_name LEFT JOIN users ON (item.user_id = users.id);

Нет объявления FROM(SELECT от чего именно?), И если вы не настроили свои модели Item или User или App, (установка $useTable = false может быть?) Вы столкнулись с необычной ошибкой.

Одна вещь, на которую следует обратить внимание, если эти модели работают нормально на других контроллерах, это любое изменение свойств каждой модели на каждом контроллере.Они не будут действовать по-разному для каждого контроллера, если у вас нет кода на каждом контроллере, который сообщает об этом.

...