【问题标题】:Laravel: Global query variable?Laravel:全局查询变量?
【发布时间】:2016-09-03 12:57:51
【问题描述】:

我有一个查询,我在几乎每个get 请求下都在我的routes.php 中使用它,并且还在我的许多视图中使用结果。此时对我来说更有意义的是调用一次查询并能够在全球范围内使用它而无需再次调用它。

这是查询:

$followers = Follower::where('user_id', '1')
    ->get();

我该怎么做?

【问题讨论】:

    标签: laravel laravel-5 laravel-5.2


    【解决方案1】:

    为什么不在 init 函数中执行一次查询并将结果存储到全局变量中?

    global $followers = Follower::where('user_id', '1')
    ->get();
    

    【讨论】:

    • 抱歉,这可能是个愚蠢的问题。我应该把这个初始化函数放在哪里?
    • @Achraf 的建议似乎是明智的。当您的用户登录时,将此查询缓存在全局变量中。
    【解决方案2】:

    您可以在每次用户登录时将其存储到会话中

    喜欢这个例子

    $followers = Follower::where('user_id', '1')
        ->first();
    Session::put('followers', 'value');
    

    任何时候你都可以像这样访问它

    $value = Session::get('followers');
    

    【讨论】:

    • 其实在我的脑海里,任何你觉得舒服的,真正有效的都很棒,如果你在理解缓存功能方面有一些问题,请随时提问,祝你好运
    【解决方案3】:

    session 的另一个答案是一个简单的解决方案,但是 为此,我建议您使用Laravel Cache(因为这是标准做法)。

    Laravel Cache::remember 接受三个参数。

    1. key: 制作一个'followers'和'user id'的md5键
    2. 时间:您希望缓存值的时间(以分钟为单位)(取决于更改值的频率)
    3. 一个闭包函数,当没有找到与键对应的值时运行。 (在这种情况下,此方法将查询一次,并将值存储在缓存中)

    只需在 BaseController 的构造函数中执行以下操作:

    $id = 1; //User id
    $key = md5('followers'.$id);
    $minutes = 60; //cache for 1 hour, change it accordingly
    $followers = Cache::remember($key, $minutes, function() use ($id) {
      return Follower::where('user_id', $id)->get();
    });
    

    现在当然要使用缓存,您需要使用一些缓存驱动程序,例如Redis

    如果您不知道如何设置它,请阅读我的另一个answer

    虽然对于您的问题可能需要更长的解决方案,并且可能需要您 15-20 分钟来设置和运行所有内容,但是相信我,一旦您开始使用缓存,您就会爱上它。

    【讨论】:

      猜你喜欢
      • 2023-01-29
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 2018-01-30
      • 2021-09-23
      相关资源
      最近更新 更多