Выбрать все элементы в каждой категории, где Item.name = bla: как? - PullRequest
0 голосов
/ 10 февраля 2012

Представьте, что у меня есть 2 модели: пункт и категория. В категории есть много предметов, и товар принадлежит категории.

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

[Item]
    ...some props...
    [Category]
        ...some props...

Пока я хочу что-то вроде:

Array
    [0][Category]
        Array
            [0][Item]
               ...some props...
            [1][Item]
    [1][Category]

... и т. Д.

Как я могу получить этот результат с помощью метода find , если это возможно? Иначе как его получить?

Моя текущая модель намного сложнее, но я думаю, что я мог бы применить эту теорию ко всем моим моделям (у меня есть отношение Category => Group => Item).

Спасибо за предложения и ответы.

1 Ответ

1 голос
/ 10 февраля 2012

В соответствии с заголовком вашего вопроса, если задача состоит в том, чтобы получать только элементы, связанные с категориями с именем «bla», вы можете просто вызвать метод find () в модели категорий вместо модели элементов.

Вместо

$this->Item->find('all', array('conditions' => array('Category.name' => 'bla')));

сделать

$this->Item->Category->find('all', array('conditions' => array('Category.name' => 'bla')));

Таким образом, он сначала отфильтрует соответствующие Категории, а затем получит связанные Предметы. Таким образом, вы получите что-то вроде

Array
(
  [0] => Array
    (
      [Category] => Array
        (
          [id] => 1
          [name] => bla
          ...
        )
      [Item] => Array
        (
          [0] => Array
            (
              [id] => 1
              ...
            )
          [1] => Array
            (
              [id] => 2
              ...
            )
        )
    )
)

EDIT

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

$categories = $this->Category->find('all', array('fields' => array('Category.id', 'Category.name', 'Item.id', 'Item.name'),
'joins' => array(
    array(  'table' => 'groups',
            'alias' => 'Group',
            'type' => 'inner',
            'conditions' => 'Group.category_id = Category.id'
        ),
    array(  'table' => 'items',
            'alias' => 'Item',
            'type' => 'inner',
            'conditions' => array('Item.group_id = Group.id', 'Item.name' => 'bla')
        ))));

Он вернет массив следующим образом:

Array
(
  [0] => Array
  (
    [Category] => Array
    (
      [id] => 2
      [name] => Shop
    )
    [Item] => Array
    (
      [id] => 1
      [name] => Bla
    )
  )
)

EDIT2

Последнее слово о структуре массива, который вы получите: он не совсем такой, как вы хотели. Массив Item находится на том же уровне, что и массив Category. Таким образом, вы можете получить много пар Category-Item для одной и той же категории.

Но тогда простой цикл foreach позволил бы вам создать массив с точным желаемым struture, и этот запрос имеет то преимущество, что получает из базы данных только то, что необходимо.

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