CakePHP - ограничение результатов от одной модели до результатов с соответствующими условиями в связанной модели - PullRequest
1 голос
/ 05 января 2012

Я только начинаю работу в 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));

Это выглядит немного окольным путем и требует дополнительного шага в поиске идентификаторадля коллекции с указанным названием, поэтому мне все еще интересно, знает ли кто-нибудь более прямое решение.

Ответы [ 2 ]

1 голос
/ 16 января 2012

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

<?php
    $this->Image->Collection->find('first', array(
      'conditions' => array('Collection.title' => 'Urban'),
      'contain' => array(
        'Image'
      )
    ));
?>
0 голосов
/ 30 июля 2012

Я написал довольно длинную статью о тонкостях моделей HABTM и CakePHP. Вы можете найти это стоящим: http://www.24100.net/2012/07/cakephp-hasandbelongstomany-relationship-queries-demystified/.

...