laravel eloquent - используйте без вложенных загруженных отношений. - PullRequest
2 голосов
/ 12 февраля 2020

В настоящее время я работаю над laravel framework, и я застрял с некоторыми связями и проблемами загрузки.

Ситуация

У меня три модели A, B и C

У меня есть два отношения

  • A имеет много B
  • B имеет много C

По умолчанию (с использованием $ с атрибутом в модели):

  • 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');
  }
}

Задача

Для уточнения c задача Я хотел бы запросить А со всеми Б и без каких-либо C

Когда я использую A::query()->with('b') C, по умолчанию загружаются

Так что я пытаясь использовать A::query()->with('b')->without('b.c') Но он продолжает загружать B в C отношения.

У вас есть идеи, как этого добиться?

Спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

Eloquent\Model имеет newQueryWithoutRelationships.

Я думаю, вы можете сделать следующее:

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

Обновление после комментарий

Интересный метод without() (не знал об этом).

Похоже, вы можете попробовать следующее:

A::query()->with(['bs' => function($query) {
    $query->without('c');
}]);
0 голосов
/ 13 февраля 2020

Это происходит из-за использования B класса, который вы использовали:

protected $with = ['cs'];

, который будет поддерживать загрузку cs() отношений с каждым запросом.

Как только вы удалили его , вы должны увидеть, что

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

будет загружать только связанные B модели без соответствующих C.

...