【问题标题】:laravel eloquent - Use without on nested eager loaded relationslaravel eloquent - 在嵌套急切加载的关系上不使用
【发布时间】:2020-05-28 10:30:45
【问题描述】:

我目前正在开发 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('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 和没有任何 C 来查询 A

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

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

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

感谢您的帮助!

【问题讨论】:

  • 你能准确地展示你的模型内部是什么样子 - 特别是你是如何设置关系方法的吗?
  • 我更新了我的帖子
  • 如果您使用受保护的 $with = ['cs'] 并且不想加载 b,则只需添加没有,如下所示 public function cs() { return $this->hasMany('应用\模型\C')->没有('b'); }

标签: laravel eloquent eager-loading eloquent-relationship


【解决方案1】:

Eloquent\Model 有一个newQueryWithoutRelationships

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

(new A())->newQueryWithoutRelationships()->with(...)

comment之后更新

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

看来您可以尝试以下方法:

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

【讨论】:

  • 不,它不起作用...newQueryWithoutRelationships() 删除模型 A 的关系,但不删除我使用 with()statement 添加的关系..
  • 答案的更新部分对我不起作用。使用 $query->without('c'); 仍然返回 c
【解决方案2】:

发生这种情况是因为您使用了 B 类:

protected $with = ['cs'];

这将急切地加载 cs() 与每个查询的关系。

删除后,您应该会看到

A::query()->with('b')

将仅加载关联的 B 模型,而不加载其对应的 C

【讨论】:

  • 是的,我知道!我的问题是,有没有办法保持我急切的负载(因为这是我的应用程序的常见情况)但仅针对一个请求将其删除?
猜你喜欢
  • 2017-09-30
  • 1970-01-01
  • 2014-12-28
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多