CakePHP: Модель-> Модель-> Найти ()

Это действительно простой вопрос, но он не объяснен в книге.

Что именно происходит, когда вы соединяете несколько моделей перед методом поиска?

Пример: $stuff = $this->Article->User->find('all');

Чем это отличается от: $this->User->Article->find('all');

Вы можете сделать больше двух? $this->Book->Chapter->Author->find('all');

Понятно, что это как-то связано с отношениями между моделями, но я думал, что они были определены в моделях, поэтому мне не ясно, что происходит.

1 ответ

Решение

Когда вы устанавливаете связь на модели. CakePHP создает его экземпляр во время выполнения и устанавливает его как свойство Object для этой модели.

class User extends AppModel
{
      public $hasMany = array('Document');
}

class Document extends AppModel
{
}

В приведенном выше примере. User объекты будут содержать свойство с именем Document, но Document не будет содержать User,

class UsersController extends AppController
{
     public $uses = array('User');

     public function index()
     {
           $this->User-find(...); // works
           $this->User->Document->find(..); // works, because of the hasMany

           $document = ClassRegistry::init('Document');
           $document->User->find(...); // does not work, not associated to User.
     }
}

Также имейте в виду, что имя свойства является псевдонимом для ассоциации. Не название модели.

class User extends AppModel
{
      public $hasMany = array(
           'Paper'=>array('className'=>'Document')
      );
}

class Document extends AppModel
{
}

Это меняет имя свойства на Paper

$this->User->Paper->find(..); // works as alias

Использование псевдонимов для ассоциаций позволяет применять условия поиска, чтобы они генерировали разные результаты.

class User extends AppModel
{
      public $hasMany = array(
           'Paper'=>array('className'=>'Document','conditions'=>array(....)),
           'Resume'=>array('className'=>'Document','conditions'=>array(....))
      );
}

Это создаст два свойства для User модели нравятся так.

$this->User->Paper->find(..); // works as alias
$this->User->Resume->find(..); // works as alias

Но условия применяются только при выполнении поиска на User модель.

Другие вопросы по тегам