Насколько обширна связь модели Object в CakePHP? - PullRequest
0 голосов
/ 10 мая 2010

Я надеялся, что кто-то с пониманием в CakePHP сможет пролить свет на вопрос, который у меня возник.

Вот мой сценарий, у меня есть User, у этого User есть Company, у которого, в свою очередь, много Department и много Address. Если бы я получил User, мог бы я рассчитывать на доступ к Company и всем моделям, связанным с этим Company?

Так возможно ли будет $user['Company']['Department'][0] или $user['Company']['Address'][0]?

Что возвращает меня к первоначальному вопросу: насколько обширна связь между моделями?

Ответы [ 3 ]

4 голосов
/ 10 мая 2010

В простой ванильной модели связь модели Cake определяется атрибутом recursive вашей модели. Ваш пример модели отношений выглядит примерно так:

User
-> belongsTo Company
   -> hasMany Department
   -> hasMany Address
-> hasMany PhoneExtension

(Я добавил дополнительные отношения (User hasMany PhoneExtension), чтобы конкретизировать следующее объяснение.)

Существует три допустимых значения для Model::recursive: -1, 0, 1 и 2. Каждое значение указывает ORM Cake разную глубину для извлечения записей модели. Я буду использовать $this->User->find('all'), чтобы проиллюстрировать разницу.

  • При recursive = -1 Cake получает только указанную модель (т. Е. User). Он не анализирует ни одну из модельных ассоциаций.

  • В recursive = 0 Cake получает указанную модель и анализирует ее belongsTo связей. $this->User->find('all') будет извлекать все записи User, а также запись Company, к которой принадлежит каждый User.

  • В recursive = 1 Cake получает указанную модель и анализирует все ее прямые ассоциации. $this->User->find('all') будет извлекать все записи User, а также запись Company, к которой принадлежит каждый User, и все записи PhoneExtension, принадлежащие User.

  • В recursive = 2 Cake получает указанную модель, анализирует все ее прямые ассоциации и все ассоциации своих прямых ассоциаций. $this->User->find('all') будет извлекать все из примера диаграммы отношения модели: все записи User, записи Company, которым принадлежат записи User, все записи PhoneExtension, принадлежащие User, и все Department и Address записей, принадлежащих Company.

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

Если вы хотите пойти на глубже , чем то, что получает recursive = 2, вам придется использовать Containable поведение . Допустим, ваша модель Department имела дополнительную связь: hasMany Group. Таким образом:

User
-> belongsTo Company
   -> hasMany Department
      -> hasMany Group
   -> hasMany Address
-> hasMany PhoneExtension

Для извлечения всего, что мы получили с помощью извлечения recursive = 2, а также всех связанных Group записей, вы должны создать свой Model::find вызов следующим образом:

$this->User->find('all', array(
    'contain' => array( 
        'PhoneExtension',
        'Company' => array(
            'Department' => array( 'Group' ),
            'Address'
        )
    )
));
0 голосов
/ 10 мая 2010

Если вы обращаетесь к классу / объекту и устанавливаете "$this->recursive = -1", тогда он возвращает только объект без зависимостей!

0 голосов
/ 10 мая 2010

Это настолько обширно, насколько вам нужно / хотите, чтобы это было. Посмотрите на параметр recursive семейства методов find(). Также поведение Containable. Конкретные ссылки, которые вы перечисляете, возможны, но непосредственно под пользователем:

$user['Department'][0]

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

...