问题描述
当前,我们可以联接2个表,例如
ModelA::join('table_b','table_a.id','=','table_b.a_id');
使用这种方法,table_b的模型(即ModelB)的默认范围不适用于查询。假设现在ModelB已启用SoftDeletes,则上述联接将不包括whereRaw('table_b.deleted_at IS NULL')
。我知道我可以使用以下代码手动添加它。
ModelA::join('table_b',function($join) {
$join->on('table_a.id','table_b.a_id')
->whereRaw('table_b.deleted_at IS NULL');
});
我想知道是否有任何加入方法,以便它自动在ModeB中应用默认范围。像这样:
ModelA::joinModel(ModelB::Class,'table_b.a_id');
解决方法
我使用了joinSub()
函数来联接子查询。因此,以下代码对我有用:
ModelA::joinSub(ModelB::select('*'),'table_b',function($join) {
$join->on('table_a.id','=','table_b.a_id');
});
通过使用joinSub()
,我还可以在ModelB上调用其他范围,例如:
ModelA::joinSub(ModelB::filterThis()->filterThat(),'table_b.a_id');
});
,
以口才的方式过滤掉相关模型上的记录-
ModelA::with('modelb')->whereHas('modelb',function($query){
$query->filterThis()->filterThat();
})->get();
,
Laravel QueryBuilder在运行查询时不考虑雄辩的范围。
您可以简单地使用Eloquent而不是Query Builder。使用Eloquent可以像这样实现:
ModelA::with('modelb')->get();
modelb
是HasMany
中定义的ModelA
关系。
上面的语句将产生以下查询:
select * from `modela` where `modelb`.`modela_id` in (1) and `modelb`.`deleted_at` is null