Yii2:使用"joinWith()"时按透视表筛选查询



取以下示例Cart模型。它具有CCD_ 2〃;枢轴记录/表";其将其链接到CCD_ 3。

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的活动查询或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连接表记录?如何访问junction ActiveQuery对象以便调用$cartItemQuery->andWhere('cartItem.created_at > NOW()');

您可以在匿名函数中传递任何变量值,使用下方的关键字链接

在这里为过滤器或任何制作您的神奇代码

->joinWith([
'items' => function($itemQuery) use ($var1,$var2){
$itemQuery->andWhere(['item.category' => 'books']);
$itemQuery->andWhere(['some_condition' => $var1]); <<<---------
},
]);

最新更新