CakePHP:Model-> Model-> find()

eme*_*his 1 php cakephp cakephp-2.0 cakephp-2.1

这是一个非常基本的问题,但书中没有解释.

在find方法之前将多个模型拼凑在一起会发生什么?

例如: $stuff = $this->Article->User->find('all');

这有什么不同于: $this->User->Article->find('all');

你能做两个以上吗? $this->Book->Chapter->Author->find('all');

很明显它与模型之间的关系有关,但我认为这些是在模型中定义的,所以我不清楚发生了什么.

Rea*_*lar 5

在模型上设置关联时.CakePHP在运行时实例化它并将其设置为该模型的Object属性.

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

class Document extends AppModel
{
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中.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.
     }
}
Run Code Online (Sandbox Code Playgroud)

此外,请记住,属性的名称是关联的别名.不是模型的名称.

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

class Document extends AppModel
{
}
Run Code Online (Sandbox Code Playgroud)

这会将属性名称更改为 Paper

$this->User->Paper->find(..); // works as alias
Run Code Online (Sandbox Code Playgroud)

在关联上使用别名允许您应用查找条件,以便它们生成不同的结果.

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

这将为User这样的模型创建两个属性.

$this->User->Paper->find(..); // works as alias
$this->User->Resume->find(..); // works as alias
Run Code Online (Sandbox Code Playgroud)

但是,条件仅适用于在User模型上执行查找时.