如何解决Yii2:使用`joinWith()`时按数据透视表过滤查询
采用以下示例 Cart
模型。它有一个 CartItem
“枢轴记录/表”,将它链接到 Item
。
class Cart extends ActiveRecord {
public function getCartItems() {
return $this
->hasMany(CartItem::class,['cart_id' => 'id'])
->inverseOf('cart');
}
public function getItems($callback = null) {
return $this
->hasMany(Item::class,['item_id' => 'id'])
->via('cartItems',$callback);
}
}
(示例 #1)此时我将能够通过 Item
的 activequery 或 CartItem
的查询进行过滤,如下所示:
$booksAddedToCartSinceYesterday = $cart
->getItems(function($cartItemQuery) {
$cartItemQuery->andWhere('cartItem.created_at > NOW()');
})
->andWhere(['item.category' => 'books']);
(示例 #2)但是,当我将静态 find()
方法与 joinWith()
结合使用时,如何实现相同的效果?在以下示例中,我只能通过 Item
的 ActiveQuery 进行圆角分析,但我不再对 CartItem
的 ActiveQuery 对象有任何引用:
$booksAddedToCartSinceYesterday = Cart::find()
->andWhere(['cart.user_id' => $some_user_id])
->joinWith([
'items' => function($itemQuery) {
$itemQuery->andWhere(['item.category' => 'books']);
},]);
如何修改上面的代码,以便能够像在示例 #1 中那样过滤 CartItem
联结表记录?如何访问联结 ActiveQuery 对象以便我可以调用 $cartItemQuery->andWhere('cartItem.created_at > NOW()');
?
解决方法
您可以通过下面的使用关键字链接在匿名函数中传递任何变量值
在这里制作您的魔术代码以用于过滤器或任何
->joinWith([
'items' => function($itemQuery) use ($var1,$var2){
$itemQuery->andWhere(['item.category' => 'books']);
$itemQuery->andWhere(['some_condition' => $var1]); <<<---------
},]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。