如何解决如何在Yii2 ActiveDataProvider中比较联接表中的值
我正在尝试创建一个搜索类来为gridview小部件提供动力。问题是我需要比较主表和联接表中的值。
我正在搜索类中这样做:
$query = User::find();
$query->joinWith(['rank']);
然后在我的过滤器中我想要类似的东西:
$query->andFilterWhere(['>=','user.rank_points','rank.promotion_points']);
但这不起作用,因为第三个参数rank.promotion_points
会以字符串形式转义,并且不会被视为mysql字段。
我尝试使用该关系来输出值,如:
$query->andFilterWhere(['>=',$this->rank->promotion_points]);
但是出现一个错误,提示$this
不具有rank
属性。
完成此操作的正确方法是什么?
根据要求进行编辑,这是以上代码产生的原始查询:
SELECT `user`.*
FROM `user`
LEFT JOIN `rank`
ON `user`.`rank_id` = `rank`.`id`
WHERE (`rank_id` NOT IN (1,2,3,4,5,6))
AND (`user`.`rank_points` >= 'rank.promotion_points')
但是我需要的是这个
SELECT `user`.*
FROM `user`
LEFT JOIN `rank`
ON `user`.`rank_id` = `rank`.`id`
WHERE (`rank_id` NOT IN (1,6))
AND (`user`.`rank_points` >= `rank`.`promotion_points`)
整个方法如下:
public function search($params)
{
$query = User::find();
$query->joinWith(['rank']);
// add conditions that should always apply here
$dataProvider = new ActiveDataProvider([
'query' => $query,]);
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to return any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
// grid filtering conditions
$query->andFilterWhere([
'id' => $this->id,'rank_id' => $this->rank_id,'created_at' => $this->created_at,'updated_at' => $this->updated_at,]);
$query->andFilterWhere(['like','username',$this->username]);
$query->andFilterWhere(['not in','rank_id',[1,6]]);
$query->andFilterWhere(['>=','rank.promotion_points']);
return $dataProvider;
rank
表模式:
+------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | UNI | NULL | |
| rank_points | int(11) | YES | | NULL | |
| promotion_points | int(11) | YES | | NULL | |
+------------------+--------------+------+-----+---------+----------------+
解决方法
您可以将此条件作为字符串传递:
$query->andWhere('user.rank_points >= rank.promotion_points');
或使用Expression
:
$query->andWhere(['>=','user.rank_points',new \yii\db\Expression('rank.promotion_points')]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。