CakePHP найти список со связанными модельными условиями - PullRequest
4 голосов
/ 17 мая 2011

Я пытаюсь получить список идентификаторов (а-ля find('list')), но не могу понять, как это сделать с соответствующими условиями модели.

Мои ассоциации: Product hasAndBelongsToMany Category Product belongsTo Manufacturer

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

Мне удалось получить один с Product-> query (), но это не в формате списка. Я мог бы циклически перемещаться по массиву и захватывать идентификаторы или что-то еще, но это кажется ужасно не-Cakey. Я хочу убедиться, что Cake по-прежнему выполняет все проверки безопасности моих запросов и любых других автоматических операций. Вот запрос, который я получил на работу:

$all_results = $return['Category']['all_results'] = $this->Product->query('
    SELECT `Product`.`id`
        FROM `categories_products` as `CategoriesProduct`
        JOIN `products` as `Product` ON (`CategoriesProduct`.`product_id` = `Product`.`id`)
        JOIN `manufacturers` as `Manufacturer` ON (`Product`.`manufacturer_id` = `Manufacturer`.`id` AND `Manufacturer`.`seo_url` = \''.$manufacturer.'\')
        WHERE `CategoriesProduct`.`category_id` IN ('.implode(',', $search_categories).')
');

это возвращает

[all_results] => Array
    (
         [0] => Array
            (
                [Product] => Array
                    (
                        [id] => 101787
                    )

            )

        [1] => Array
            (
                [Product] => Array
                    (
                        [id] => 100781
                    )

            )

        [2] => Array
            (
                [Product] => Array
                    (
                        [id] => 101887
                    )

            )

        [3] => Array
            (
                [Product] => Array
                    (
                        [id] => 101888
                    )

            )

    )

Примечание: $search_categories - это список идентификаторов категории (то есть: array(12,42,24,5))

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

Проблема с желаемым результатом заключается в том, что Cake не вернет вам удаленный массив результатов, если вы используете условия в связанных моделях.

Это происходит потому, что Cake будет использовать эти условия только для вашей связанной модели и возвращать вам результаты с условиями, действительными для ваших связанных моделей.

Если вы хотите вернуть продукты только с определенной категорией, вам нужно выполнить запрос через модель категории, поскольку это дает вам возможность использовать условия для ваших продуктов. Это может выглядеть примерно так:

$this->Category->find('all', array('conditions' => array('Category.id' => 2));

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

Я бы лучше взглянул на Linkable Plugin , который должен дать вам именно ту функциональность, которую вы хотели, поскольку он расширяет Cake при использовании объединений, как вы делали в своем запросе. Это позволяет получать результаты с условиями на связанных моделях.

3 голосов
/ 17 мая 2011

CakePHP может быть нечетным conditions для связанных моделей.Особенно с отношениями HABTM.Даже если для recursive установлено самое высокое значение (т. Е. 2).Проверьте документы для более подробной информации о HABTM .

Попробуйте следующее.Хотя из вышесказанного, я не думаю, что это будет работать:

$conditions = array('Category.id' => $category_ids, 'Manufacturer.seo_url' => $manufacturer);
$this->Product('list', array('recursive' => 1, 'conditions' => $conditions));

Кроме того, по возможности избегайте query().Весь смысл MVC состоит в том, чтобы изолировать данные от дисплей от логика .Использование таких вещей, как query(), просто ломает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...