【问题标题】:Laravel: eager loading user for navbarLaravel:导航栏的急切加载用户
【发布时间】:2018-03-29 13:42:52
【问题描述】:

我有一个用户与 hasMany 关系“动物”。

在导航栏中将显示第一个动物结果以及他收集了多少。

{{Auth::user()->animals()->first()->name}}
{{Auth::user()->animals()->first()->amount}}

这会产生两个 sql 查询。

既然这是导航栏,那么始终将用户加载到 $user 变量中的安全方法是什么?

如果我使用 Auth::user() 我怎么能急切地加载动物?

全局用户变量是否有意义,或者控制器总是将 $user 传递给视图是否更好、更安全?

此代码还产生三个查询:

$user=Auth::user();
$user->load('animals');
echo     $user->animals()->first()->name;
echo     $user->animals()->first()->amount;

我认为 first() 是罪魁祸首。 访问预先加载的集合的第一个元素的正确和最简单的方法是什么?

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    你做得对,除了

    $user=Auth::user();
    $user->load('animals');
    echo     $user->animals()->first()->name;
    echo     $user->animals()->first()->amount;
    

    把这个改成这个

    $user=Auth::user();
    $user->load('animals');
    echo     collect($user->animals)->first()->name;
    echo     collect($user->animals)->first()->amount;
    

    或者你也可以这样做

    $user=Auth::user();
    $user->load('animals');
    echo     $user->animals->first()->name;
    echo     $user->animals->first()->amount;
    

    当您执行echo $user->animals()->first()->name; 时,它指的是执行查询的模型。但是$user->animals->first()->name 指的是已经使用load() 加载的集合

    希望对你有帮助

    【讨论】:

    • 谢谢。第二个例子是完美的,在这种情况下甚至不需要加载。我试过了,它仍然只执行一个 sql 查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2021-04-23
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多