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

laravel eloquent - Use without on nested eager loaded relations

我目前正在研究 laravel 框架,但我遇到了一些关系和急切加载问题。

情况

我有A、B、C三个模型

我有两个关系

默认(在模型中使用 $with 属性):

所以大部分时间我使用 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