【问题标题】:Laravel - Single query then splitting Vs Two queriesLaravel - 单个查询然后拆分与两个查询
【发布时间】:2015-04-27 18:28:52
【问题描述】:

我正在使用 laravel 框架,我需要获得 2 个数组,一个带有高级主题,一个带有免费主题。所以我会这样做:

$premium_themes = \App\Theme::where('premium', '=', '1')->get();
$free_themes = \App\Theme::where('premium', '=', '0')->get();

这可以正常工作,但会在数据库上执行两个查询。由于我是一个优化极客,我认为有一个查询可能会更好......我会通过使用它来获得所有主题:

$themes = \App\Theme::all();

然后我会在 php 中处理这个以根据主题高级属性进行拆分。

所以我有两个问题:

1) 在这种情况下,单个查询优于 2 个查询,还是我想多了?

2) 有没有一种快速简单的方法可以根据高级属性将结果集合拆分为两个集合? (我知道 Laravel 有很多快捷方式,但我还是这个框架的新手)

【问题讨论】:

    标签: php laravel optimization


    【解决方案1】:

    我认为将其保留为单独查询的唯一原因是如果您需要对数据进行分页 - 如果将所有数据混合在一起,您将无法轻松做到这一点。

    “捷径”将是使用集合filter() 方法,我将捷径放在引号中,因为它本身并不短,更多的是合成糖 - 但如果没有充满糖,Larvel 什么都不是,为什么不呢?

    代码看起来像这样:

    $allThemes = \App\Theme::all();
    
    $premiumThemes = $allThemes->filter(function($theme)
    {
        return $theme->premium;
    });
    
    $freeThemes = $allThemes->filter(function($theme)
    {
        return !$theme->premium;
    });
    

    编辑:我建议使用 Matt Burrow 的答案,但我会留在这里,因为解决方案不同。

    【讨论】:

      【解决方案2】:

      单个查询会更好,因为两个查询都会遍历数据库中的所有行。除了拆分它们的 2 个查询将再次检查它们。

      您可以像这样简单地过滤它们;

      简单的一条线解决方案$themes = \App\Theme::all()->groupBy('premium');.

      如果您需要按另一个元素等过滤,或者进入单独的集合,只需在以下内容中添加更多内容;

      $themes = \App\Theme::all();
      
      $premium = new Collection;
      $free = new Collection;
      
      $themes->each(function ($item) use ($premium, $free){
          if($item->premium == '1'){
              $premium->push($item);
          } 
          else {
              $free->push($item);
          }
      });
      

      您的项目将被过滤到相关的Collection。确保使用顶部的 Collection 类。

      【讨论】:

      • 我找到了一个简单的单行解决方案.. 你觉得这个 Matt 怎么样?:$themes = \App\Theme::all()->groupBy('premium'));跨度>
      • @RaphaelCabrera 已编辑以包含此内容。
      猜你喜欢
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多