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

时间:2016-08-23 16:01:30

标签: php eloquent relationship eager-loading

我在我的应用程序中使用php slim3 fraemwork和eloquent orm。 我一直困惑于雄辩的关系......

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

我们说我有公司和用户模型 用户具有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();

但我总是拥有我需要的所有数据 - 无需再次从db重新获取它。 创建后是否有办法让相关用户返回公司?

2 个答案:

答案 0 :(得分:0)

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

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

看起来不明显和棘手

如果有其他办法可以解决我的案件,请提供建议吗?

答案 1 :(得分:0)

我知道这个答案确实很老,但是我在搜索类似内容时偶然发现了这个...

我认为最好的方法是通过Thisload()使用懒惰的快速加载(如果您只想在尚未加载时加载它们)。

因此,在您的示例中,您可以执行以下操作:

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