CakePHP 约定的创建有几个原因;保持一致并减少使您的应用程序工作所需的配置量。
但是,CakePHP 并不禁止您使用不符合约定的命名。在某些情况下,您将不得不忽略约定(想想将用于不遵循 CakePHP 约定的 CakePHP 项目的第三方数据库),您的情况就是其中之一。
与“相同”模型的多重关系
Cake 允许您为每个关系的模型设置不同的别名。这样,您可以实现您在问题中描述的内容,而不会发生冲突。但是,因为第二个关系的外键不会遵循 CakePHP 的约定,CakePHP 不会自动选择正确的列,所以您必须自己指定。
例如
class Post extends AppModel {
public $belongsTo = array(
// CakePHP will automatically use 'user_id' as foreign key
'User',
// Here we create an 'alias' for the User Model
// also, we need to specify the foreign key to use
// for the relation
'Editor' => array(
'className' => 'User', // name of the Model
'foreignKey' => 'editor_id', // foreign key for this relation
),
);
}
Post
模型现在与模型有两个关系User
。一个有别名Editor
别名的工作方式与“常规”模型相同;即就像有一个Editor
模型附加到邮政;
在您的控制器中,两者都find()
将返回所有用户,并实际使用“用户”模型:
$this->Post->User->find('all');
$this->Post->Editor->find('all');
重要的
CakePHP 使用别名来缓存模型信息。如果您为模型使用别名,则永远不应为另一个模型使用相同的别名。CakePHP 在这些情况下可能会使用其他模型的缓存信息,从而导致不可预知的结果!
例如
class Post extends AppModel {
public $belongsTo = array(
'Editor' => array(
'className' => 'User',
'foreignKey' => 'editor_id',
),
);
}
class Comment extends AppModel {
public $belongsTo = array(
'Editor' => array(
'className' => 'Visitor', // WRONG!! Editor alias is already
// used as alias for the User model!
'foreignKey' => 'editor_id',
),
);
}