Laravel渴望建立深厚的关系

时间:2018-12-14 12:41:28

标签: laravel laravel-5 eloquent

我对Laravel有点and,渴望与他们建立关系。我有三个模型AssetFolderAssetDownloadLog

  • AssetFolder通过Asset的HasMany assets
  • Asset通过DownloadLog的HasMany 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 :(得分:0)

只需为此专门在AssetFolder模型中创建一个不同的关系,然后就可以为此进行加载。

public function assetsWithDownloads()
{
    return $this
        ->hasMany(Asset::class)
        ->with('downloads');
}