Есть, по крайней мере, три способа сделать это.
1) Использовать `morphedByMany`на православномна буржуйскомclass Note extends Model
{
public function second()
{
return $this->morphedByMany(SomeModelSecond::class, 'taggable');
}
public function first()
{
return $this->morphedByMany(SomeModelFirst::class 'taggable');
}
}
Notes::with('first.relationFirst', 'second.relationSecond');
Хотя это и приводит к изменению структуры дерева отношений, этот способ кажется вполне разумным.
Вы можете по прежнему использовать `morphTo()` там, где не требуется жадная загрузка различных отношений.
2) Использование глобальной жадной загрузки
доки нет - личный опыт и
кусочки сырцов:
class SomeModelFirst extends Model
{
public $with = ['relationFirst'];
public function notes()
{
return $this->morphMany(App\Note::class, 'noteable');
}
public function relationFirst()
{
return $this->belongsTo(Photo::class);
}
}
class SomeModelSecond extends Model
{
public $with = ['relationSecond']
public function notes()
{
return $this->morphMany(App\Note::class, 'noteable');
}
public function relationSecond() {
return $this->belongsToMany(Comment::class);
}
}
однако, следует понимать что теперь эти связи будут загружаться жадно
всегда, за исключением тех случаев, когда вы явно или косвенно вызываете newQueryWithoutRelationships . Например тот же самый метод with() перекрывает $with указанный в модели.
Таким образом, можно обыграть эту особенность метода, сбросив жадно-загружаемые отношения
SomeModelFirst::with([])->get();
3) Ручная группировка коллекций.на православномна буржуйском$notes = Notes::with('noteable');
$notesGrouped = $noted->groupBy(function($model){
return get_class($model);
});
$notesGrouped[SomeModelFirst::class]->load('relationFirst');
$notesGrouped[SomeModelSecond ::class]->load('relationSecond');
Так как объекты в php передаются по ссылке, в моделях исходной коллекции $notes теперь будут загружены необходимые отношения. Этот способ кажется наименьшей болью.
Наверняка найдутся и иные способы сделать это. Но прямо сейчас мне довольно лениво думать об этом =)