Запрос полиморфных отношений laravel «многие ко многим»

У меня есть таблица Estate_object, которая содержит информацию об имуществе, например: адрес, город, регион и т. д. Затем у меня есть отдельные таблицы, которые содержат только определенное свойство объекта, например, одна из таблиц — objects_near. Я сделал для этого отдельные таблицы, потому что каждая из этих моделей может содержать несколько значений (они являются флажками), например, objects_near не может содержать такие значения, как - парковка, аэропорт, просмотр, магазин и т. д. Поэтому, чтобы избежать ненужных столбцов и нулевых полей в таблице Estate_object, я сделал полиморфная связь «многие ко многим» между таблицей Estate_objects и таблицами, содержащими свойства. На мой взгляд, я хочу сделать фильтр, и запрос из таблицы Estate_object работает нормально. Для фильтрации свойств, принадлежащих одному или нескольким объектам недвижимости, у меня есть флажки. Например, для запроса объектов рядом с недвижимостью у меня есть флажки с несколькими вариантами. Я не могу понять и не могу найти решение о том, как запрашивать свойства objects_near, которые относятся только к конкретному объекту Estate_object.

Вот как выглядит мой флажок:

<div class="form-group align-items-center">
  <label class="col-form-label text-md-right">{{ trans('admin.estate-obj.label.columns.objects_near') }} 
  </label><br>
     @foreach($estate_objects_near as $objects_near)
         <input type="checkbox" id="{{ $objects_near->name }}" name="objects_near[]" value="{{ 
          $objects_near->id }}">  
       <label for="{{ $objects_near->name }}">{{ $objects_near->name }} </label>
     @endforeach  
/div>

Модель Estate_object_near:

  public function estateObj()
    {
        return $this->morphToMany(EstateObj::class, 'estateable');
    }

Модель EstateObj:

   public function objectsNear()
    {
        return $this->morphedByMany(Estate_objects_near::class, 'estateable');
    }

EstateObjController:

   function( $query) use ($request) {

                if($request->has('address')){
                    $query->where('address', $request->address);
                }

                if($request->has('price')){                      
                    $query->whereBetween('price', [$request->price['min'], $request->price['max']]);
                }

                if($request->has('room_qty') ){
                    $query->where('room_qty', $request->room_qty);
                }

                // trying to access properties which are selected in checkbox and related to estate 
                 object
               if($request->has('objects_near')){

                $objNear = Estate_objects_near::find(1);
                $obj = $objNear->estateObj;
                $query->where($obj, $request->objects_near);
            }

             
            });

Если я выгружаю $obj, я получаю отношения со сводной таблицей 'estateable', и я могу видеть, какое свойство связано с конкретным объектом недвижимости, но когда я пытаюсь выполнить, он показывает мне SQLSTATE [HY093]: неверный номер параметра: смешанный именованный и позиционные параметры. Я также пытался использовать функцию whereHas, но потом получаю эту ошибку: аргумент 1, переданный в Illuminate\Database\Eloquent, должен быть экземпляром.

Пробовали и whereHasMorph:

$query->whereHasMorph('estateable', [Estate_objects_near::class], function ($query) {
     $query->where('id', $request->objects_near);
     })->get();
                

Это приводит к «Вызову неопределенного метода App\Models\EstateObj::estateable()»

Был бы очень признателен за предложения.


person Richard Wolf    schedule 26.08.2020    source источник


Ответы (1)


У меня работал следующий запрос:

         if($request->has('objects_near')){
            $query->whereHas('objectsNear', function ($query) use ($request) {
            $query->whereIn('estate_objects_near.id', [$request->get('objects_near')]);
            })->get();
        }

Как оказалось, whereHasMorph работает только с отношениями morphTo. Если у кого-то есть такая же проблема, и вы хотели бы узнать больше о структуре моего кода, дайте мне знать.

person Richard Wolf    schedule 01.09.2020