0

在我的网球应用程序中,我的“比赛”桌有两名球员(显然)。我使用 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 的每个玩家显示用户的名字/姓氏。这行得通吗?外键可以使用数组吗?模型操作在搜索时可以使用“或”吗?

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

干杯,保罗

4

1 回答 1

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。:)

于 2010-03-06T01:09:01.960 回答