У меня есть таблица 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()»
Был бы очень признателен за предложения.