CakePHP содержит условия, не ограничивающие результаты?

Я пытаюсь найти продуктовые товары пользователя в списке по категориям. Ассоциации есть Категория hasMany Item hasMany User через продуктовый магазин. Я использую Контейнерное Поведение, и оно не отфильтровывает все остальные Бакалеи. Он возвращает каждый элемент в основном.

Моя функция контроллера:

function showlist() {
$categories = $this->Category->find('all', array(
    'contain' => array(
        'Item' => array(
            'Grocery' => array(
                'conditions' => array(
                    'Grocery.user_id =' => $this->Auth->user('id')
                )
            )
        )
    )
));

Массив, который возвращается:

Array
(
    [0] => Array
        (
            [Category] => Array
                (
                    [id] => 10
                    [parent_id] => 
                    [name] => Dairy
                    [lft] => 1
                    [rght] => 6
                )

            [Item] => Array
                (
                )

        )

[1] => Array
    (
        [Category] => Array
            (
                [id] => 11
                [parent_id] => 10
                [name] => Milk
                [lft] => 2
                [rght] => 3
            )

        **[Item] => Array
            (
            )**

    )

[2] => Array
    (
        [Category] => Array
            (
                [id] => 12
                [parent_id] => 10
                [name] => Cheese
                [lft] => 4
                [rght] => 5
            )

        [Item] => Array
            (
            )

    )

[3] => Array

Я не хочу возвращать какие-либо массивы Item, у которых нет Grocery (ItemUser) под ними.


Это работает, но теперь это только показывает категорически. Мне нужно, чтобы показать все элементы одной категории в этом вложенном массиве.

Это показывает:

Array
(
[0] => Array
    (
        [Category] => Array **<--This could be the same category as**
            (...)

        [Item] => Array
            (...)

        [Grocery] => Array
            (...)
    )
[1] => Array
    (
        [Category] => Array **<--This**
            (...)

        [Item] => Array
            (...)

        [Grocery] => Array
            (...)
    )
[2]...

И мне нужно, чтобы это было:

Array
(
[0] => Array
    (
        [Category] => Array 
            (...
            [Item] => Array
            (...)

            [Item] => Array
            (...)
            )
    )
[1] => Array
    (
        [Category] => Array
            (...)

        [Item] => Array
            (...)
    )
[2]...

Даже не нужен массив Grocery, просто нужно искать их по критериям.

2 ответа

Решение

Вы не можете ограничить результаты своей основной Модели в зависимости от условий в Контейне. Когда вы используете contain()фактически создает несколько запросов, что не позволяет вам ограничивать в зависимости от условий.

Чтобы решить эту проблему, вам нужно использовать JOINs [см. CakePHP Joining Tables ] вместо Содержать.

Если вы хотите вложенное форматирование, не могли бы вы перенести все это на другой (например, Groceries) контроллер, который позволил бы вам ограничиться по user_id или (но я должен признать, что я не уверен, является ли это хорошей практикой Cake, хотя я успешно использовал этот подход... в 1.3 все равно) что-то вроде:

$groceries = $this->Category->Item->Grocery->find('all', array(
    'conditions' => array(
         Grocery.user_id =' => $this->Auth->user('id')
    )
));
Другие вопросы по тегам