这是一个非常基本的问题,但书中没有解释。
在 find 方法之前将多个模型组合在一起时究竟会发生什么?
前任:$stuff = $this->Article->User->find('all');
这与以下有何不同:$this->User->Article->find('all');
你能做两个以上吗?$this->Book->Chapter->Author->find('all');
很明显它与模型之间的关系有关,但我认为这些是在模型中定义的,所以我不清楚发生了什么。
这是一个非常基本的问题,但书中没有解释。
在 find 方法之前将多个模型组合在一起时究竟会发生什么?
前任:$stuff = $this->Article->User->find('all');
这与以下有何不同:$this->User->Article->find('all');
你能做两个以上吗?$this->Book->Chapter->Author->find('all');
很明显它与模型之间的关系有关,但我认为这些是在模型中定义的,所以我不清楚发生了什么。
当您在模型上设置关联时。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
但是,这些条件仅适用于对模型执行查找时。