Я столкнулся с проблемой с Laravel и нетерпеливыми отношениями при загрузке.У меня есть три модели AssetFolder
, Asset
& DownloadLog
AssetFolder
HasMany Asset
через assets
Asset
HasMany DownloadLog
через downloads
В настоящее время я запрашиваю определенную папку активов, и при этом я жду загрузки активов.
$folder = AssetFolder::where('name', 'Example')
->with([
'assets' => function (HasMany $query) {
$query->orderBy('name', 'asc');
}
])->first();
Эта часть прекрасно работает.Но для целей этого запроса я также хотел бы загрузить каждую Asset
связанную DownloadLog
запись.Я пробовал решение № 1 -
$folder = AssetFolder::where('name', 'Corporate Assets')
->with([
'assets' => function (HasMany $query) {
$query->orderBy('name', 'asc');
},
'assets.downloads'
])->first();
Теперь я ожидаю, что моя модель Asset
будет содержать отношение под названием downloads
, заполненное DownloadLog
объектами, но, к сожалению, это было не так.На отношения downloads
даже не ссылались.Тогда я попробовал решение № 2 -
$folder = AssetFolder::where('name', 'Corporate Assets')
->with([
'assets' => function (HasMany $query) {
$query
->with('downloads')
->orderBy('name', 'asc');
}
])->first();
Это тоже не сработало - тот же результат, что и выше.Теперь я ожидал, что это сработает, но это не так.Итак, чтобы проверить, я вошел в свою AssetFolder
модель и обновил свой метод отношений HasMany следующим образом -
public function assets()
{
return $this
->hasMany(Asset::class)
->with('downloads');
}
И это работает!Это здорово, но проблема в том, что в 90% случаев я не хочу извлекать журналы загрузок вместе с активами, которые я загружаю.Вот почему я думал, что решение № 2 будет работать, потому что я думал, что это просто изменило запрос HasMany.
Я что-то здесь не так делаю?
Крис.