Я только начинаю работу в CakePHP, и у меня возникают проблемы с ограничением получаемых результатов теми, где поле в связанной модели соответствует определенному значению.Я нашел много связанных вопросов здесь и в других местах, но они, кажется, имеют дело с ситуациями, которые являются или более сложными, или более простыми, чем мой сценарий, так что здесь мы идем:
У меня есть две модели, которые я 'Меня интересуют: Изображение и Коллекция , которые связаны отношением HABTM .Взаимосвязь в Image.php и Collection.php установлена правильно с помощью таблицы соединений collection_images , и у меня не было проблем с записью или получением данных в целом. Containable также правильно настроен в модели Image.
Я хотел бы выполнить find () для $ this-> Image и вернуть только те, которые принадлежат определенномуколлекция, название которой $ collection .Я пробовал это несколькими разными способами:
$this->Image->contain("Collection"); // to exclude other models "Image" is related to
pr($this->Image->find("all",
array("conditions" => array("Collection.title" => $collection))
));
Для этого я получаю следующую ошибку:
Ошибка: SQLSTATE [42S22]: столбец не найден:1054 Неизвестный столбец 'Collection.title' в 'выражении where'
Кажется, вы не можете напрямую установить условие поиска через связанную модель, поэтому я вернулся и попытался ограничить свой содержат следующим образом:
$this->Image->contain(array(
"Collection" => array(
"conditions" => array(
"Collection.title" => $collection))));
pr($this->Image->find("all"));
На этот раз я получаю результаты, но они включают Изображения , которые не относятся к нужной коллекции.Вот упрощенный фрагмент, который мне дает pr () для $ collection = "Urban" :
[3] => Array
(
[Image] => Array
(
[id] => 39
[title] => Star Trails over Greenlake
)
[Collection] => Array
(
)
)
[4] => Array
(
[Image] => Array
(
[id] => 40
[title] => Aurora Bridge and Reflections
)
[Collection] => Array
(
[0] => Array
(
[id] => 3
[title] => Urban
[CollectionsImage] => Array
(
[id] => 62
[collection_id] => 3
[image_id] => 40
)
)
)
)
Как видите, он пропускает Collection данные для изображений , где заголовок Collection не соответствует $ collection , но он по-прежнему включает данные Image .
Что мне здесь не хватает?Есть ли способ заставить один из этих двух подходов делать то, к чему я стремлюсь?
Для справки, я также пошел по этому пути в другом направлении:
$this->Collection->find("all", array("conditions" => array("Collection.title" => $collection)))
, которыйвозвращает только нужные данные.Тем не менее, структура массива данных, которые он возвращает, создает сложности в других местах моего кода, и я хотел бы в конечном итоге иметь возможность разбивать на страницы непосредственно из Image .
Спасибо за ваше время ипомогите всем.
РЕДАКТИРОВАТЬ :
После дополнительного поиска я нашел здесь приемлемое решение:
http://cakebaker.42dh.com/2007/10/17/pagination-of-data-from-a-habtm-relationship/
Это потребовало от меня создать модель для таблицы сопоставления "CollectionsImage.php" и установить отношения hasOne к обоим Image и Коллекция .Затем выполняется paginate () для CollectionsImage , например:
$data = $this->paginate("CollectionsImage", array("Collection.id" => $collection_id));
Это выглядит немного окольным путем и требует дополнительного шага в поиске идентификаторадля коллекции с указанным названием, поэтому мне все еще интересно, знает ли кто-нибудь более прямое решение.