1

按照约定,如何使用同一张表的两个外键制作一张表。以博客教程和简单身份验证和授权应用程序教程为例,其中表有一个 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
);

显然我不能添加另一列 user_id 来代表修改的用户。我该怎么做,有可能吗?对不起我的英语不好

4

1 回答 1

5

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',
        ),
    );
}
于 2013-03-21T22:08:15.473 回答