首页 > 解决方案 > Orwhere has 方法不允许 null

问题描述

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

我读了这个网址并写了同样的逻辑。 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/Query/Builder 中调用.php 在第 907 行

如果 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');
} }

标签: laraveleloquent

解决方案


我推测您开始使用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);
 }

推荐阅读