laravel eloquent - 不使用嵌套的急切加载关系

Bal*_*lin 5 eager-loading laravel eloquent eloquent-relationship

我目前正在研究 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');
  }
}
Run Code Online (Sandbox Code Playgroud)

问题

对于特定任务,我想使用所有 B 而没有任何 C 查询 A

当我使用A::query()->with('b')C 时默认加载

所以我正在尝试使用A::query()->with('b')->without('b.c') 但它不断加载 B 到 C 的关系。

您对如何实现这一目标有任何想法吗?

谢谢你的帮助 !

Tho*_*een 6

Eloquent\ModelnewQueryWithoutRelationships

我认为您可以执行以下操作:

(new A())->newQueryWithoutRelationships()->with(...)
Run Code Online (Sandbox Code Playgroud)

评论后更新

有趣的方法without()(不知道)。

看起来您可以尝试以下操作:

A::query()->with(['bs' => function($query) {
    $query->without('c');
}]);
Run Code Online (Sandbox Code Playgroud)

  • 答案的更新部分对我不起作用。使用 `$query->without('c');` 仍然返回 c (4认同)