我通过order_items
数据透视表有一个与图书(图书模型)相关的订单(订单模型)表:
public function books()
{
return $this->morphedByMany('App\Models\Book', 'order_item')
->withPivot(['quantity', 'presenter_id', 'price', 'portion', 'settlement_id']);
}
我需要在数据透视表(order_items)中过滤其presenter_id
为空的结果。
但是没有类似wherePivotNull
的方法。我也试过下面的解决方案(reference),但没有机会:
public function books()
{
return $this->morphedByMany('App\Models\Book', 'order_item')
->withPivot(['quantity', 'presenter_id', 'price', 'portion', 'settlement_id'])
->getQuery()->whereNull('order_items.presenter_id')->get();
}
它抛出了这个异常:
关系方法必须返回Illuminate \ Database \ Eloquent \ Relations \ Relation类型的对象(查看:E:\ xampp \ htdocs \ pnu \ resources \ views \ orders \ table.blade.php)(查看:E:\ XAMPP \ htdocs中\ PNU \资源\视图\订单\ table.blade.php)
答案 0 :(得分:1)
您只需要直接在关系上调用whereNull()
,但您需要确保使用数据透视表的名称限定字段名称。
public function books()
{
return $this->morphedByMany('App\Models\Book', 'order_item')
->whereNull('order_items.presenter_id')
->withPivot(['quantity', 'presenter_id', 'price', 'portion', 'settlement_id']);
}
当您在关系上调用whereNull()
时,它将在内部调用基础查询构建器上的whereNull()
,然后返回关系对象。在您提供的示例中,您直接在查询构建器上调用whereNull()
(首先调用getQuery()
),这将返回查询构建器对象,这将引发异常。