2013-12-10 6 views
1

У меня есть база данных:CakePHP (2,4) Глубокое Отношения

Companies | Users | Files 
- ID    - ID   - ID 
        - company_id - user_id 

Так что для моих моделей:

  • hasmany Компания пользователя
  • пользователя belongsto Компания & hasmany Файл
  • belongsto Файл пользователя

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

Я мог бы получить все идентификаторы пользователей, за которыми следует запрос в поиске файлов с этими идентификаторами. Но мне было интересно, есть ли лучший способ cakePHP?

Я довольно новичок в тортике.

Благодаря

ответ

1

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

$users = $this->Company->User->find('all', array(
    'conditions' => array('User.company_id' => $id), 
    'fields' => array('id', 'company_id'), 
    'contain' => array('File'), 
)); 

Результат ($users) будет выглядеть примерно так:

array(
    0 => array(
     'User' => array(
      'company_id' => '75', 
      'id' => '51' 
     ), 
     'File' => array(
      0 => array(
       'id' => '399', 
       'user_id' => '51', 
       ... 
      ), 
      1 => array(
       'id' => '337', 
       'user_id' => '51', 
       ... 
      ) 
      ... 
     ) 
    ) 
    1 => array(
     'User' => array(
      'company_id' => '75', 
      'id' => '65' 
     ), 
     'File' => array(
      0 => array(
       'id' => '450', 
       'user_id' => '65', 
       ... 
      ), 
      ... 
     ) 
    ) 
) 

Вы можете затем получите массив файлов, используя Hash utility.

$files = Hash::extract($users, '{n}.File.{n}'); 

Который даст вам что-то вроде этого:

array(
    0 => array(
     'id' => '399', 
     'user_id' => '51', 
     ... 
    ), 
    1 => array(
     'id' => '337', 
     'user_id' => '51', 
     ... 
    ), 
    3 => array(
     'id' => '450', 
     'user_id' => '65', 
     ... 
    ), 
    ... 
) 

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

public $actsAs = array('Containable'); 
+0

Работает как очарование. Благодаря! – Lapidus

+0

Теперь я мог бы связать имя пользователя с файлом в том же массиве? – Lapidus

+1

Да, Контейнер может быть рекурсивным. Просто измените '' contains '=> array (' File ') 'to'' содержать '=> array (' File '=> array (' User ')) 'или'' содержать '=> array (' File '= > array ('User' => array ('fields' => array ('username')))) '. –

0

CakePHP не поможет вам в этом, и даже если хотите написать MySQL запрос, который вы не можете сделать это, не используя таблицу файлов только до тех пор, и если вы будете добавлять company_id в таблице файлов.

Смежные вопросы