Laravel:whereNull for pivot

时间:2016-07-02 08:53:19

标签: laravel pivot-table relationship

我通过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)

1 个答案:

答案 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()),这将返回查询构建器对象,这将引发异常。