Laravel стремится загрузить глубокие отношения - PullRequest
0 голосов
/ 14 декабря 2018

Я столкнулся с проблемой с 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.

Я что-то здесь не так делаю?

Крис.

1 Ответ

0 голосов
/ 14 декабря 2018

Просто создайте другое отношение в модели AssetFolder специально для этой цели и загружайте его.

public function assetsWithDownloads()
{
    return $this
        ->hasMany(Asset::class)
        ->with('downloads');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...