Yii 2 根据连接表中的值过滤多对多关系

标签 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 连接到事件,用一个整数告诉他们是被接受还是被拒绝

从模型文件 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]);
}

和查询,在休息 Controller 内:
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 来获取扩展了 acceptMembers 和 deniedMembers 的事件对象。我从调用中收到以下数据库错误:
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 是要走的路。

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

最佳答案

我在 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]);
    });
}

关于Yii 2 根据连接表中的值过滤多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41848246/

相关文章:

php - Yii2,带有属性名称的自定义验证消息

yii - 任何人都知道用于显示模型关系和表模式(包括键和注释)作为流程图的 Yii 扩展或方法吗?

php - Yii 验证码没有改变

php - Yii 模块内的小部件

php - Yii2 在使用公共(public)目录运行多个应用程序时找不到文件

php - Yii2 下拉列表 onchange

php - yii2 中的 kartik 文件输入错误

php - Yii2 REST URL 不工作,除了 GET

MySQL 左/右/外连接

mysql - Yii2 查询群组中的用户