取以下示例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]); <<<---------
},
]);