Yii 2 过滤结点中值的多对多关系 table
Yii 2 Filter many-to-many relation on a value in the junction table
我如何在 Yii 2.0 中使用多对多关系,根据 connection/junction table 中的值过滤结果?
我有以下 tables
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 和 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 函数中使用的条件。
我在 documentation 中读到它应该只用于过滤相关的 table 而不是连接点 table。所以我不认为 onCondition 是正确的选择。
有没有办法过滤结点中设置的值的关系 table?
我在 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.0 中使用多对多关系,根据 connection/junction table 中的值过滤结果?
我有以下 tables
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 和 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 函数中使用的条件。
我在 documentation 中读到它应该只用于过滤相关的 table 而不是连接点 table。所以我不认为 onCondition 是正确的选择。
有没有办法过滤结点中设置的值的关系 table?
我在 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]);
});
}