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'); } }
答案 0 :(得分:1)
我推测您是使用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);
}
答案 1 :(得分:1)
我相信是因为$languages
或$fields
是null
。
由于->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();