В другом месте есть метод не допускает ноль - PullRequest
0 голосов
/ 05 ноября 2019

введите описание изображения здесь Я пытаюсь реализовать поиск отношений "многие ко многим" с 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, но вместо этого получил эту ошибку.

Аргумент 1 передан в Illuminate \ Database \ Query \ Builder :: cleanBindings() должен иметь тип массива с указанным нулевым значением, который вызывается в /var/www/jtf/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php в строке 907

кажется, что это вызывает эту ошибку, если либо A, либо B имеет значение null, но почему ??? Метод OrWhereHas работает только тогда, когда есть вход ??

/ добавлена ​​информация /

мое сообщение об ошибке моя модель агентства

класс Агентство расширяет Model {protected $охраняется = ['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');
} }

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Я полагаю, это потому, что либо $languages, либо $fields равны null.

Поскольку ->whereIn() ожидает массив, но вы передаете ноль.

Вы простонужно убедиться, что вы передаете массив.

$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();
1 голос
/ 05 ноября 2019

Я предполагаю, что вы начали цепочку запросов where с orWhereHas(), который мог вызвать проблему, попробуйте начать с 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);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...