Orwhere has方法不允许null

enter image description here我正在尝试使用2个模型实现多对多关系搜索。 我从多个复选框值中获取输入,并希望在有数据输入时搜索与A或B匹配的项目。

我读了这个URL并写了相同的逻辑。 https://laracasts.com/discuss/channels/laravel/many-to-many-relationship-with-2-pivot-table-data-search

public function search(Request $request)
{
    $languages = $request->lang;
    $fields = $request->field;

    $agencies = Agency::with('languages')->with('specialized_fields')
        ->orWhereHas('languages',function($query) use ($languages) {
            $query->whereIn('language_id',$languages);
        })
        ->orWhereHas('specialized_fields',function($query) use ($fields) {
            $query->whereIn('specialized_field_id',$fields);
        })
        ->get();

        dd($agencies);
}

我希望实现A或B搜索,但是却出现了此错误。

  

传递给Illuminate \ Database \ Query \ Builder :: cleanBindings()的参数1必须为数组类型,给定为null,在/ var / www / jtf / vendor / laravel / framework / src / Illuminate / Database /中调用907行上的Query / Builder.php

如果A或B为空,似乎会导致此错误,但是为什么呢? OrWhereHas方法仅在有输入时有效吗?

/添加的信息/

我的错误信息 我的代理商模式

  

级代理商扩展了模型{       受保护的$ guarded = [           'ID'       ];

public function languages(){
    return $this->belongsToMany('App\Language');
}
public function specialized_fields(){
    return $this->belongsToMany('App\SpecializedField');
}

public function region(){
    return $this->hasOne('App\Region');
} }
jayoyhjay 回答:Orwhere has方法不允许null

我推测您是使用orWhereHas()开始了where查询链,这可能导致了问题,请尝试以whereHas()开始。

 public function search(Request $request){
     $languages = $request->lang;
     $fields = $request->field;

     $agencies = Agency::with('languages','specialized_fields') // you can get away by just using one with(),not needed but its cleaner this way
         ->whereHas('languages',function($query) use ($languages) { // previously orwherehas
                 $query->whereIn('language_id',$languages);
         }) ->orWhereHas('specialized_fields',function($query) use ($fields) {
             $query->whereIn('specialized_field_id',$fields);
         })
         ->get();

     dd($agencies);
 }
,

我相信是因为$languages$fieldsnull

由于->whereIn()需要一个数组,但是您传递的是null。

您只需要确保要传递一个数组即可。

$languages = array_filter((array) $request->lang); // cast to array & remove null value
$fields = array_filter((array) $request->field);

$agencies = Agency::with('languages','specialized_fields')
    ->orWhereHas('languages',function($query) use ($languages) {
        $query->whereIn('language_id',$languages);
    })
    ->orWhereHas('specialized_fields',function($query) use ($fields) {
        $query->whereIn('specialized_field_id',$fields);
    })
    ->get();
本文链接:https://www.f2er.com/3161437.html

大家都在问