查询laravel多态多对多关系



我有一个estate_object表,它包含有关庄园的信息,例如:地址、城市、地区等。然后我有一个单独的表,它只保存对象的特定属性,例如其中一个表是objects_near。我为此制作了单独的表格,因为每个模型都可以保存多个值(它们是复选框(,例如objects_near不能保存值,如-parking、airport、see、store等。因此,为了在estate_object表中转义不必要的列和空字段,我在estate_objects表和包含属性的表之间建立了多态的多对多关系。在我看来,我想做一个过滤器,从estate_object表中查询内容可以很好地工作。要筛选属于一个或多个房地产对象的属性,我有复选框。例如,要查询庄园附近的对象,我有带有多个选项的复选框。关于如何查询仅与特定estate_object相关的objects_near属性,我也找不到解决方案。

我的支票簿是这样的:

<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,我将获得与透视表"estable"的关系,我可以看到哪个属性与特定的estate obj相关,但当我尝试执行时,它会显示SQLSTATE[HY093]:无效参数编号:混合命名参数和位置参数。我也尝试过使用whereHas函数,但后来我得到了这个错误-传递给Illuminate\Database\Eloquent的参数1必须是一个实例。

也尝试过HasMorph:

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

这导致"调用未定义的方法App\Models\EstateObj::esteable((">

非常感谢您的建议。

以下查询对我有效:

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

事实证明,HasMorph只适用于morphTo关系。如果有人有同样的问题,想了解更多我的代码结构,请告诉我。

最新更新