首页 文章

Yii 2过滤联结表中值的多对多关系

提问于
浏览
1

如何在Yii 2.0中使用多对多关系,我在哪里过滤连接/联结表中的值的结果?

我有以下表格

Member (id INT, name, ...)
Event (id INT, name, date, ...)
EventMemberConnection (id INT, event_id INT, member_id INT, accepted TINYINT(1) DEFAULT 0, foreign keys....)

成员通过EventMemberConnection连接到事件,并带有一个整数,告知它们是被接受还是被拒绝

从模型文件Event.php:

/**
 * @return \yii\db\ActiveQuery
 */
public function getAcceptedMembers() {
    return $this->hasMany(Member::className(), ['id' => 'member_id'])->viaTable('EventMemberConnection acceptedConnection', ['event_id' => 'id'])->onCondition(['acceptedConnection.accepted' => 1]);
}

/**
 * @return \yii\db\ActiveQuery
 */
public function getDeclinedMembers() {
    return $this->hasMany(Member::className(), ['id' => 'member_id'])->viaTable('EventMemberConnection declinedConnection', ['event_id' => 'id'])->onCondition(['declinedConnection.accepted' => 0]);
}

和查询,在休息控制器内:

public function prepareDataProvider() {
    $query = Event::find();

    $query->joinWith('acceptedMembers acceptedMember');
    $query->joinWith('declinedMembers declinedMember');

    $query->groupBy(['Event.id']);

    return new ActiveDataProvider([
        'query' => $query
    ]);
}

我正在使用REST API来获取使用acceptedMembers和rejectedMembers扩展的事件对象 . 我从调用中收到以下数据库错误:

Column not found: 1054 Unknown column 'acceptedConnection.accepted' in 'where clause'
The SQL being executed was: SELECT * FROM `Member` `acceptedMember` WHERE (`id` IN ('5', '9')) AND (`acceptedConnection`.`accepted`=1)

我猜主要的查询很顺利,但是在Yii获取相关成员的额外调用中它添加了onConnection函数中使用的条件 .

我在documentation中读到它只应用于过滤相关表而不是连接表 . 所以我不相信onCondition是要走的路 .

有没有办法过滤关联表中设置的值的关系?

1 回答

  • 2

    我在documentation中发现,您可以向viaTable()函数添加一个回调函数,该函数可用于自定义联接查询 . 你可以像这样使用它:

    public function getAcceptedMembers() {
        return $this->hasMany(Member::className(), ['id' => 'member_id'])->viaTable('EventMemberConnection acceptedConnection', ['event_id' => 'id'], function($query){
            $query->where(['acceptedConnection.accepted' => 1]);
        });
    }
    

相关问题