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
модель.