【问题标题】:Laravel - Eager loading from model relationshipLaravel - 从模型关系中急切加载
【发布时间】:2021-11-29 17:22:55
【问题描述】:

在我的页面上,我有以下分页查询:

$followingUsers = $user->followerUsers()->paginate(80); 

在刀片模板中,我 @foreach $followingUsers 作为 $follower

在这个foreach循环中,有如下检查:

@if (Auth::user()->isFollowed($follower))

这是引用 我正在使用 Laravel N+1 检测器,这告诉我我应该执行以下操作:

您应该添加 "with('App\Follower')" 以预先加载此关系。

这当然行不通,我不能只写这样的东西:

$followingUsers = $user->followerUsers()->with('App\Follower')->paginate(80);

这当然会导致错误。

那么我该如何编写这个急切的负载呢?比如……

$followingUsers = $user->followerUsers()->with(Auth::user()->isFollowed($follower))->paginate(80);  

什么的。我不知道。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    我假设 isFollowed$follower 模型上的关系来获取该模型有多少关注者,所以检测器告诉您要做的是在 @987654323 上加载该方法使用的关系@收藏:

    // I'm guessing the name of the relationship that is called.
    $followingUsers = $user->followerUsers()->with('followers')->paginate(80);
    

    这将解决您的错误,但它不是最理想的解决方案,因为您的用户可能都有很多关注者,因此您正在为内存中的 80 个用户加载所有关注者,只是为了查看他们是否包含经过身份验证的用户。 一种更有效的方法是加载经过身份验证的用户的关注者并在isFollowed 中使用它。然后你不需要加载任何东西,因为经过身份验证的用户保持不变,Laravel 可以存储关系的结果以供后续调用。

    【讨论】:

    • 好点!我之前实际上做过类似的事情,所以我很惊讶我没有想到它。谢谢!
    猜你喜欢
    • 2017-09-17
    • 2018-12-11
    • 2013-06-10
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2017-04-12
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多