急切加载未正确加载

时间:2018-08-17 15:30:01

标签: php laravel laravel-5 eloquent

使用热切加载时发生奇怪的事情。 例如,我希望获取与用户相关的所有作者,并且一切正常,但是当我使用急切加载时,效果并不理想。

示例:

Users:
 - id;
 - name
 - ...
Authors:
 - id
 - user_id
 - ...

模型用户:

 public function authorsProfile()
    {

        return $this->hasMany(Author::class, 'user_id', 'id');

    }

我的控制器:

$user = Auth::user();

//Get all users and the authors that is related with it (Not working well)
dd( $user->with('authorsProfile')->get());

//Get all authors that is related with this user (Working well)
dd( $user->authorsProfile);

在我的情况下,应该只向我提供与当前经过身份验证的用户相关的作者,但是由于某些原因,当我出于某种原因尝试使用eagerloading时,会得到所有用户并存在关联(作者)...

有人知道怎么了吗?

2 个答案:

答案 0 :(得分:0)

调用->get()将执行一个全新的查询,该查询将提取所有用户。

您正在寻找lazy eager loading:

$user->load('authorsProfile');

答案 1 :(得分:0)

如果您已经加载了User,则使用->with()是不正确的方法。对于您的情况,请尝试->load()

$user = Auth::user();
$user->load("authorsProfile");

dd($user->authorsProfile); // Should be a Collection

从技术上讲,您甚至不需要调用->load(),因为尝试访问未加载->with()的关系将在此时加载它:

$user = Auth::user();
dd($user->authorsProfile); // Should also be a Collection

要使其像编码时一样工作,您需要致电:

$user = Auth::user();
$user = User::with(["authorsProfile"])->where("id", "=", $user->id)->first();
dd($user->authorsProfile);

但是,您可以看到为什么效率不高;您将再次调用数据库以检索您已有的记录。

因此,有很多方法可以完成此任务。看看可以做什么。