草庐IT

laravel - 获取包含 10 个项目的缓存 Eloquent 集合超时

coder 2023-11-07 原文

我正在构建一个搜索功能,该功能返回使用 LengthAwarePaginator 分页的大型集合。我正在尝试使用名为 $searchFilter_$query_$offsetPages 的键来缓存结果,以获取单页返回结果(10 项)。它进入缓存就好了。但是,当我尝试使用 Cache::has($key) 检查或使用 Cache::get($key) 获取时超时。

同样的问题出现在浏览器和 artisan Tinker 中。奇怪的是,当我将一组随机的 10 个项目放入 Tinker 的缓存中并取回它们时,一切正常。我使用 Redis 作为缓存驱动程序。

这是我的 Controller 方法:

public function search($filter, $query, $layout, Request $request) {
  if($layout == "list-map") {
    return view("list-map")->with(['filter' => $filter, 'query' => $query, 'layout' => 'list-map']);      
  } else {
    $offsetPages = $request->input('page', 1) - 1;
    $cacheKey = $filter . "_" . $query . "_" . $offsetPages;

    if(Cache::has($cacheKey)) {
      \Log::info("fetching results from cache");
      $data = Cache::get($cacheKey);

      $totalCt = $data[0];
      $results = $data[1];
    } else {
      $results = $this->getResults($filter, $query);
      $totalCt = $results->count();
      $results = $results->slice($offsetPages, $this->resultsPerPage);

      \Log::info("caching results");
      Cache::put($cacheKey, [$totalCt, $results], 5);
    }

  $results = new LengthAwarePaginator($results,
    $totalCt,
    $this->resultsPerPage,
    $request->input('page', 1),
    ['path' => LengthAwarePaginator::resolveCurrentPath()]
  );

    return view($layout)->with(['filter' => $filter, 'query' => $query, 'layout' => $layout, 'results' => $results]);
  }

}

最佳答案

因此,问题在于从我的 getResults() 方法返回的集合中的许多模型都是通过关系查询获得的。当我在 10 个结果的单页上使用 dd($results) 时,我可以看到每个模型上都有一个“关系”字段。该数组中有数千个基于我最初查询的关系的递归相关模型。我找不到有关不急于加载这些相关模型的选项的任何信息。相反,我想出了一些直接获取模型的变通方法:

  $results = $results->slice($offsetPages, $this->resultsPerPage);

      //load models directly so they don't include related models.
      $temp = new \Illuminate\Database\Eloquent\Collection;
      foreach($results as $result) {
        if(get_class($result) == "App\Doctor") {
          $result = Doctor::find($result->id);
        } else if(get_class($result == "App\Organization")) {
          $result = Organization::find($result->id);
        }
        $temp->push($result);
      }
      $results = $temp;

      \Log::info("caching results");
      Cache::put($cacheKey, [$totalCt, $results], 5);

如果有人知道在这种情况下的最佳做法,请告诉我。谢谢!

编辑: 我找到了一个更好的解决方案而不是上述解决方法。如果我这样查询我的关系:$taxonomy->doctors()->get() 而不是 $taxonomy->doctors,它不会加载巨大的递归关系。

关于laravel - 获取包含 10 个项目的缓存 Eloquent 集合超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53981151/

有关laravel - 获取包含 10 个项目的缓存 Eloquent 集合超时的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  5. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  6. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  7. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  8. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  9. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  10. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

随机推荐