Laravel 5 在Laravel中将表与其模型的默认范围连接起来

Laravel 5 在Laravel中将表与其模型的默认范围连接起来,laravel-5,eloquent,laravel-query-builder,Laravel 5,Eloquent,Laravel Query Builder,目前,我们可以连接两个表,如 ModelA::连接'table_b','table_a.id','=','table_b.a_id'; 使用这种方法,表_b ie:ModelB的模型上的默认作用域不会应用于查询。假设ModelB现在启用了SoftDeletes,上述联接将不包括whereRaw“table_b.deleted_at IS NULL”。我知道我可以用下面的代码手动添加这个 ModelA::join'table_b',函数$join{ $join->on'table_a.id','=

目前,我们可以连接两个表,如

ModelA::连接'table_b','table_a.id','=','table_b.a_id'; 使用这种方法,表_b ie:ModelB的模型上的默认作用域不会应用于查询。假设ModelB现在启用了SoftDeletes,上述联接将不包括whereRaw“table_b.deleted_at IS NULL”。我知道我可以用下面的代码手动添加这个

ModelA::join'table_b',函数$join{ $join->on'table_a.id','=','table_b.a_id' ->其中,raw“table_b.deleted_at为空”; }; 我想知道是否有任何方法可以加入,以便在ModeB中自动应用默认作用域。比如:

ModelA::JoinModelB::类,'table_a.id','=','table_b.a_id';

Laravel QueryBuilder在运行查询时不考虑有说服力的范围。

您可以简单地使用Elount而不是查询生成器。有了雄辩,就可以这样实现:

ModelA::使用'modelb'->get; 其中modelb是ModelA中定义的HasMany关系

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

从'modela'中选择*,其中'modelb`.'modela\u id`在1和'modelb`.'deleted\u at'为空 我使用joinSub函数来连接子查询。因此,以下代码对我有效:

ModelA::joinSubModelB::选择“*”,“表b”,函数$join{ $join->on'table_a.id','=','table_b.a_id'; }; 通过使用joinSub,我还可以调用ModelB上的其他作用域,如:

ModelA::joinSubModelB::filterThis->filterThat'table_b',function$join{ $join->on'table_a.id','=','table_b.a_id'; };
以雄辩的方式过滤出相关模型上的记录-

ModelA::with('modelb')->whereHas('modelb', function($query){
      $query->filterThis()->filterThat();
})->get();

即时加载modelb不会过滤ModelA。它将返回带有模型_b的表_a中所有未删除的行。我想筛选表_a中没有相关行的行,这些行的deleted_at为null。