将表及其模型的默认范围合并到Laravel中

问题描述

当前,我们可以联接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();

modelbHasMany中定义的ModelA关系。

上面的语句将产生以下查询:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...