【问题标题】:which cakephp relationship should be used for groups of users? can haveMany use array for foreign_ID?用户组应该使用哪种 cakephp 关系? foreign_ID 可以有很多使用数组吗?
【发布时间】:2010-03-05 23:55:32
【问题描述】:

在我的网球应用程序中,我的“比赛”桌有两名球员(显然)。我使用 player1_id 和 player2_id 作为跟踪用户 ID 的一种方式。不过,我没有包含 user_id 外键。

还有一个“用户”表,我想从中提取玩家的姓名。

因为“匹配”有多个用户并且用户有多个模型,所以我想知道以下模型配置是否可行:

我已经这样设置了用户模型:

var $name = 'User';
var $hasMany = array(
'Match' => array(
'className' => 'Match',
'foreignKey' => array( 'player1_id', 'player2_id'),
'dependent' => true,
)

和这样的匹配模型:

var $name = 'Match';
var $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' =>  'user_id',
'conditions' => '',
)

我需要显示每个玩家的用户名/姓氏,其中 user_id = player1_id 或 player2_id。这行得通吗?外键可以使用数组吗?模型运算可以在搜索时使用“或”吗?

或者有没有更好的方法来组织一个包含多个用户的表格(比如一场比赛,或者可以是一个小组会议)?

干杯, 保罗

【问题讨论】:

    标签: php cakephp foreign-keys models relationships


    【解决方案1】:

    我不认为将数组作为 User > Match 关系上的外键会起作用,但话又说回来,我从未尝试过。但是,与 user_id 作为外部的单个匹配 > 用户关系将不起作用,因为正如您所说,该外部 id 不存在。

    从概念上讲,最简洁的方法是适当的 hasAndBelongsToMany 关系。毕竟一场比赛有很多选手,选手也有很多比赛。所以你真正看到的是多对多关系。

    要使用 belongsTo/hasMany 关系来伪造它,您需要这样做:

    // user model
    var $hasMany = array(
       'MatchAsPlayer1' => array(
           'className'  => 'Match',
           'foreignKey' => 'player1_id',
       ),
       'MatchAsPlayer2' => array(
           'className'  => 'Match',
           'foreignKey' => 'player2_id',
       )
    );
    
    // match model
    var $belongsTo = array(
        'Player1' => array(
            'className'  => 'User',
            'foreignKey' =>  'player1_id'
        ),
        'Player2' => array(
            'className'  => 'User',
            'foreignKey' =>  'player2_id'
        )
    );
    

    丑陋的部分在 User 模型中,您会在其中收到相关匹配项,这些匹配项分为 ['MatchAsPlayer1']['MatchAsPlayer2']。您可以在afterFind 回调中做一些技巧来合并它们,但总体而言这不是一个好的解决方案。只需选择 hasAndBelongsToMany。 :)

    【讨论】:

    • 谢谢。 HASBTM 确实让我印象深刻,但不确定。我认为可能会有尝试的方法,因为您可能有类似的情况,例如三/四或更多玩家的桌子。由于每场比赛有两名球员,每个用户/比赛 HASBTM 模型是否也会采用上述数组?
    • @Paul 对不起,我不明白这个问题。不过,供您参考,通常的首字母缩写词是“HABTM”。
    • 感谢 deceze 的帮助。 HABTM,注意到。我想了解的是,在用户模型中是否应该同时引用 player1_id 和 player2_id?就像上面一样。既然比赛表有两个玩家ID,那么每个ID都需要在HABTM关系中引用吗?如果将其比作一个带有标签和帖子 HABTM 的博客,则每个博客都只有一个外键。希望这更有意义。非常感谢。
    • @Paul 如果你想使用 Cake 的自动获取相关结果和上面的“fake”belongsTo/hasMany 关系,那么是的,这两个关系都需要单独声明。如果您想走 hasMany 路线而没有缺点,您可以编写自己的 SQL 查询,而不是依赖 Cake 生成的查询。如果您使用 HABTM 关系,尽管这些问题完全消失了,您只有一个 User hasAndBelongsToMany Match 关系。
    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多