Yii 2过滤连接表中某个值上的多对多关系

Yii 2过滤连接表中某个值上的多对多关系,yii,yii2,yii2-model,Yii,Yii2,Yii2 Model,在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连接到事件,并带有一

在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]);
}
以及rest控制器内的查询:

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

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

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

    return new ActiveDataProvider([
        'query' => $query
    ]);
}
我正在使用RESTAPI获取扩展了acceptedMembers和declinedMembers的事件对象。我从调用中获得以下数据库错误:

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函数中使用的条件

我在文章中读到,它应该只用于过滤相关表,而不是连接表。所以我不相信onCondition是一条路要走

是否有方法根据连接表中设置的值筛选关系?

我在中发现,您可以向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]);
    });
}

你的问题在哪里?没有加入查询。谢谢,我已将其添加到问题中。