0

我有以下表格:

CREATE  TABLE match (
    id INT NOT NULL PRIMARY KEY,
    home_team_id INT,
    away_team_id INT,
    ...
)

CREATE  TABLE scorer (
   id INT NOT NULL PRIMARY KEY,
   match_id INT,
   player_id INT,
   ....
)

在 Match 模型中,我定义了一个类似这样的关系:

class Match extends CActiveRecord {
    public function relations() {
        return array(
            'scorers' => array(
                self::HAS_MANY,
                'Scorer',
                'match_id',
             ),
             ...
        );
    }
}

如何获得至少有一名得分手的所有 Match 模型?

4

2 回答 2

1

来自论坛上的这篇文章

$matches = Match::model()->with(array('scorers'=>array('joinType'=>'INNER JOIN','together'=>true)))->findAll();

它未经测试,尽管它看起来是正确的。给它一个狂欢。

于 2013-10-08T19:16:13.040 回答
0

如果您担心性能问题,则不应使用:

$matches = Match::model()->with(array('scorers'=>array('joinType'=>'INNER JOIN','together'=>true)))->findAll();

仅仅因为这将为每场比赛获取所有相应的得分手。

如果您不需要获取得分手数据,您应该尝试将其添加到您的Match模型中(仅作为示例):

public function findAllHavingScorer()
{
    $matchAlias = $this->tableAlias;
    $scorerTable = Scorer::model()->tableName();

    return $this->findAll(array(
        'condition'=>"EXISTS (SELECT * FROM $scorerTable WHERE $scorerTable.post_id=$matchAlias.id)",
    ));
}

在你只需要使用这个之后:

$matches = Match::model()->findAllHavingScorer();
于 2013-10-08T20:35:26.277 回答