在 Laravel 中将表与其模型的默认范围联接



目前,我们可以加入两个类似的表

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_a.id', '=', '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', function($join) {
$join->on('table_a.id', '=', 'table_b.a_id');
});

过滤掉相关Model上的记录,Eloquent方法-

ModelA::with('modelb')->whereHas('modelb', function($query){
$query->filterThis()->filterThat();
})->get();
Laravel QueryBuilder在运行查询时不考虑Eloquent作用域。

您可以简单地使用Eloquent而不是Query Builder。使用Eloquent可以这样实现:

ModelA::with('modelb')->get();

其中,modelb是在ModelA中定义的HasMany关系。

上述语句将产生以下查询:

select * from `modela` where `modelb`.`modela_id` in (1) and `modelb`.`deleted_at` is null

最新更新