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')
)
));