Laravel 模型关系也会自动获取所有其他模型关系

Laravel Model Relations fetch automatically all other model relations too

我希望有人能帮助我。

我有 3 个模型,例如用户、任务和子任务。 这些已经通过 hasOne 或 hasMany 链接。 一切正常。 现在我通过 Task::where(..)->with(['user','subtask'])... 调用数据并得到相应的结果。

问题是 Subtask 有一个 User 的引用,我在使用任务模型时没有得到查询到的用户信息。

如果我使用子任务模型,我会得到用户信息。

如何设置所有对查询模型的引用也同时从数据库中查询?

一次要return个关系数据,可以使用以下机制:

$Data = $Task::where(...)
    ->with([
        'user'=>function($userQuery){
            // mechanism is recursive; you can extend it to infinity :)
            $userQuery->with([
                            'other', 
                            'relationships', 
                            'here'=>function($hereQuery){ ... } 
                        ]); 
        },

        'subTask',

        'anotherRelationship' => function($anotherRelationship) {
            $anotherRelationship->select('column');
            $anotherRelationship->where('column2', 'whatever');
        }
    ])
    ->get();

// dump data
dd($Data);

我不知道你是否正在寻找这个——如果你想在模型实例化后加载一些关系,你可以在你的模型代码中附加一个魔法变量 $with 并指定哪个您要加载的关系:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    protected $fillable = ['col1', 'col2', 'col3', ...];

    // specify which relationships you want to load automatically
    protected $with = [
        'users',
        'anotherRelationship'=>function($anotherRelationshipQuery){
            $anotherRelationshipQuery->select( ... );
        },
        'andSomeOtherRelationship'

        ...
    ];

    ...
}

现在您不再需要在检索数据时手动加载关系。它们是自动加载的:

$Data = $Tast::where( ... )->get();

dd($Data);