如何在Eloquent中创建后立即加载关系


How to eager load relations right after creation in Eloquent

我在我的应用程序中使用php slim3框架和雄辩的形式。我对雄辩的关系感到困惑……

我想在创建时用关系填充我的对象

假设我有一个Company和User模型用户有company方法,公司也有users方法。两种方法的描述都很恰当

//User.php
company() 
{
    return $this->belongsTo('Company');
}
//Company.php
users()
{
    return $this->hasMany('User');
}

我想在某个地方创建一个有用户的新公司

function doSomething(array $data)
{
    $company= new Company();
    //fill it
    //...
    $users = [];
    foreach ($data['user_emails'] as $email)
    {
        $users[] = new User(['email' => $email]);
    }
    $company->users()->saveMany($users);
    $company->save();
    return $company();
}

$company = doSomething(['emails'] => ['foo@mail.com', 'buz@mail.com']);
//rely on build in to Model toString that uses json serialization
echo $company;

在这个例子中公司和关系将被保存-它工作但在公司json将是公司仅我希望用户也能看到它

如果我已经有了这个公司,我可以使用with

echo Company::query()->with('user')->get();

但是我已经有了我需要的所有数据-不需要再次从数据库中重新获取它。是否有办法在公司创建后立即返回相关用户?

我知道这个答案真的很老,但是我在搜索类似的东西时偶然发现了这个…

我认为最好的方法是使用延迟急切加载,与load()loadMissing()(如果你想加载只有当他们还没有加载)。

那么,在你的例子中,你可以这样做:

return $company->load('users');

找到了一个棘手的方法在从doSomething方法返回之前手动启动关系。

$company->setRelation('users', new Collection($users));

看起来不明显和棘手

请告知是否有其他方式可以到达我的箱子?