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

时间:2020-06-19 15:55:09

标签: laravel eloquent laravel-relations

我希望有人能帮助我。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

要一次返回更多关系数据,可以使用以下机制:

$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);