laravel eloquent - 不使用嵌套的预加载关系
laravel eloquent - Use without on nested eager loaded relations
我目前正在研究 laravel 框架,但我遇到了一些关系和急切加载问题。
情况
我有A、B、C三个模型
我有两个关系
- A有很多B
- B有很多C
默认(在模型中使用 $with 属性):
- A 不包括 B
- B 包括 C
所以大部分时间我使用 A 不带 B 和 B 带 C
这是我设置关系方法和预加载的方式
class A extends Model {
...
protected $with = [];
public function bs() {
return $this->hasMany('App\Models\B');
}
}
class B extends Model {
...
protected $with = ['cs'];
public function cs() {
return $this->hasMany('App\Models\C');
}
public function a() {
return $this->belongsTo('App\Models\A');
}
}
class C extends Model {
...
public function b() {
return $this->belongsTo('App\Models\B');
}
}
问题
对于特定任务,我想用所有 B 查询 A 而没有任何 C
当我使用时 A::query()->with('b')
默认加载 C
所以我正在尝试使用 A::query()->with('b')->without('b.c')
但它一直在加载 B 到 C 的关系。
你知道如何做到这一点吗?
感谢您的帮助!
Eloquent\Model
有一个 newQueryWithoutRelationships
。
我认为您可以执行以下操作:
(new A())->newQueryWithoutRelationships()->with(...)
后更新
有趣的方法without()
(不知道)。
看来您可以尝试以下操作:
A::query()->with(['bs' => function($query) {
$query->without('c');
}]);
发生这种情况是因为 B
class 您使用了:
protected $with = ['cs'];
这将预先加载每个查询的 cs()
关系。
删除后,您应该会看到
A::query()->with('b')
只会加载关联的 B
模型,而不会加载其对应的 C
。
我目前正在研究 laravel 框架,但我遇到了一些关系和急切加载问题。
情况
我有A、B、C三个模型
我有两个关系
- A有很多B
- B有很多C
默认(在模型中使用 $with 属性):
- A 不包括 B
- B 包括 C
所以大部分时间我使用 A 不带 B 和 B 带 C
这是我设置关系方法和预加载的方式
class A extends Model {
...
protected $with = [];
public function bs() {
return $this->hasMany('App\Models\B');
}
}
class B extends Model {
...
protected $with = ['cs'];
public function cs() {
return $this->hasMany('App\Models\C');
}
public function a() {
return $this->belongsTo('App\Models\A');
}
}
class C extends Model {
...
public function b() {
return $this->belongsTo('App\Models\B');
}
}
问题
对于特定任务,我想用所有 B 查询 A 而没有任何 C
当我使用时 A::query()->with('b')
默认加载 C
所以我正在尝试使用 A::query()->with('b')->without('b.c')
但它一直在加载 B 到 C 的关系。
你知道如何做到这一点吗?
感谢您的帮助!
Eloquent\Model
有一个 newQueryWithoutRelationships
。
我认为您可以执行以下操作:
(new A())->newQueryWithoutRelationships()->with(...)
有趣的方法without()
(不知道)。
看来您可以尝试以下操作:
A::query()->with(['bs' => function($query) {
$query->without('c');
}]);
发生这种情况是因为 B
class 您使用了:
protected $with = ['cs'];
这将预先加载每个查询的 cs()
关系。
删除后,您应该会看到
A::query()->with('b')
只会加载关联的 B
模型,而不会加载其对应的 C
。