【问题标题】:How to eager load relations right after creation in Eloquent如何在 Eloquent 中创建后立即加载关系
【发布时间】:2016-08-23 16:01:29
【问题描述】:

我在我的应用程序中使用 php slim3 框架和 eloquent orm。 我对雄辩的关系加载感到困惑..

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

假设我有一个 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();

但我已经拥有我需要的所有数据 - 无需再次从 db 重新获取它。 有没有办法在创建后立即将公司与相关用户一起返回?

【问题讨论】:

    标签: php eloquent relationship eager-loading


    【解决方案1】:

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

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

    看起来不明显和棘手

    如果有任何其他方式可以解决我的问题,请告知?

    【讨论】:

      【解决方案2】:

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

      我认为最好的方法是使用延迟加载,使用 load()loadMissing()(如果您只想在它们尚未加载时加载)。

      因此,在您的示例中,您可以这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-06
        • 1970-01-01
        • 2020-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        • 2022-01-24
        相关资源
        最近更新 更多