遵循约定,如何将具有两个外键的表创建到同一个表.以博客教程和简单身份验证和授权应用程序教程为例,其中表有一个user_id帖子,代表引用用户表的帖子的创建者.如何设计存储表,除了开发人员之外,另一个用户可能是修改器.
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(50),
role VARCHAR(20),
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL,
user_id INT(11);// cakephp here knows the relationship itself
);
Run Code Online (Sandbox Code Playgroud)
显然我无法添加另一列user_id来表示修改的用户.我怎么能这样做,有可能吗?对不起我的英语不好
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
),
);
}
Run Code Online (Sandbox Code Playgroud)
该Post模型现在与模型有两个关系User.带有别名Editor
的别名别名与"常规"模型的工作方式相同; 就像有一个Editor模型附在邮政;
在您的控制器中,两者都find()将返回所有用户,并实际使用"用户"模型:
$this->Post->User->find('all');
$this->Post->Editor->find('all');
Run Code Online (Sandbox Code Playgroud)
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',
),
);
}
Run Code Online (Sandbox Code Playgroud)