【问题标题】:how to define two foreign keys in cakePHP如何在 cakePHP 中定义两个外键
【发布时间】:2010-07-02 20:39:49
【问题描述】:

我有一张有几列的表格。
该表有一个主键(replyid)和两个外键(userid 和 postid)。

这是表的结构: {replyid, content, userid, postid}

Reply 表有两个外键。
我不确定这样设置外键是否正确:

class Post extends AppModel{   
    var $name = 'Post';
    var $useTable = 'post';
    var $primaryKey = 'postid';
    var $belongsTo = 'User';
    var $hasMany = array(
        'Reply' => array(
            'className'     => 'Reply',
            'foreignKey'    => 'postid',          
            'foreignKey'    => 'userid'     
                        )
                        );  

                            }

?>

你能帮忙吗?

【问题讨论】:

    标签: cakephp


    【解决方案1】:

    两个外键没问题,但你应该在正确的模型中定义关系。

    在您的帖子模型中,

    var $hasMany = array( 
        'Reply' => array( 
            'className'     => 'Reply', 
            'foreignKey'    => 'postid',           
            //'foreignKey'    => 'userid'
                        ) 
                        );   
    

    在您的用户模型中,

    var $hasMany = array( 
        'Reply' => array( 
            'className'     => 'Reply', 
            //'foreignKey'    => 'postid',            
            'foreignKey'    => 'userid'      
                        ) 
                        );   
    

    【讨论】:

    • 多个外键,正如 SpawnCxy 所说,很好——而且通常是常态。我会坚持 Cake 约定,并将它们命名为 post_id、user_id。
    【解决方案2】:

    很遗憾,CakePHP 不支持复合键或部分主键。根据CakePHP manual 的建议,您可以使用直接查询调用,例如:

    CREATE TABLE posts_tags (
      id INT(10) NOT NULL AUTO_INCREMENT,
      post_id INT(10) NOT NULL,
      tag_id INT(10) NOT NULL,
      PRIMARY KEY(id)); 
    

    ...或者,您可以创建一个代理键,也许是一个自动增量值。除了使用自动增量键作为主键,您还可以使用 char(36)。然后,每当您使用 Model::save 方法保存新记录时,CakePHP 将使用唯一的 36 字符 uuid (String::uuid)。 (来自CakePHP Manual

    【讨论】:

      【解决方案3】:

      在数据库中构建您的表并使用cake bake 构建模型 - 这样您将看到 Cake 如何本地处理它。我建议您将数据库列命名为 foreign_id。它会让生活变得更轻松。

      【讨论】:

        猜你喜欢
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        • 1970-01-01
        • 2013-10-19
        • 2020-05-29
        相关资源
        最近更新 更多