我目前正在研究 laravel 框架,我遇到了一些关系和急切的加载问题。
情况
我有三种型号 A、B 和 C
我有两个关系
- A 有很多 B
- B 有很多 C
默认情况下(使用模型中的 $with 属性(:
- A 不包括 B
- B 包括 C
所以大多数时候我使用没有 B 的 A 和 C 的 B
这是我如何设置关系方法和预先加载的方法
class A extends Model {
...
protected $with = [];
public function bs() {
return $this->hasMany('AppModelsB');
}
}
class B extends Model {
...
protected $with = ['cs'];
public function cs() {
return $this->hasMany('AppModelsC');
}
public function a() {
return $this->belongsTo('AppModelsA');
}
}
class C extends Model {
...
public function b() {
return $this->belongsTo('AppModelsB');
}
}
问题
对于特定任务,我想查询所有 B 和没有任何 C 的 A
当我使用A::query()->with('b')
C
时默认加载所以我正在尝试使用A::query()->with('b')->without('b.c')
但它不断加载 B 到 C 的关系。
您知道如何实现这一目标吗?
感谢您的帮助!
EloquentModel
有一个newQueryWithoutRelationships
。
我认为您可以执行以下操作:
(new A())->newQueryWithoutRelationships()->with(...)
评论后更新
有趣的方法without()
(不知道(。
看起来您可以尝试以下操作:
A::query()->with(['bs' => function($query) {
$query->without('c');
}]);
发生这种情况是因为在您使用的类B
:
protected $with = ['cs'];
这将急切地加载cs()
与每个查询的关系。
删除它后,您应该会看到
A::query()->with('b')
将仅加载关联的B
模型,而不加载其相应的C
。