Laravel基于来自子选择查询的数据的流畅查询

时间:2013-10-06 08:35:00

标签: laravel laravel-4

我正在尝试 - 使用laravel 4来获取一个查询,该查询产生一周中每一天的平均访客/客户数量,例如在给定时间段内的周一,周三,周三等。

我可以使用以下查询在mySql中执行此操作:

SELECT day_of_week, AVG(visitors_sum) average_order FROM 
(
  SELECT DAYNAME(play_date) day_of_week, 
     DAYOFWEEK(play_date) day_num, 
     TO_DAYS(play_date) `date`,
     sum(group_size) visitors_sum
  FROM reservations 
  GROUP BY `date`
) temp
GROUP BY day_of_week 
ORDER BY day_num

我尝试简单地使用查询执行db :: raw但不起作用。除此之外我无法解决这个问题。我尝试使用以下方法创建子查询:

$average = DB::table('reservations',
        DB::raw('DAYNAME(play_date) AS day_of_week, 
                 DAYOFWEEK(play_date) AS day_num, 
                 TO_DAYS(play_date) AS playdate,
                 sum(group_size) as visitors_sum)'))
        ->groupBy('day_of_week')
        ->get();

但是出现了错误未知列'day_of_week'所以我假设流利不能支持groupBy中的别名并且可能是sortby?

那么,我如何重新创建此查询以获得我需要的结果,理想情况是在一次调用中?

任何帮助表示赞赏

由于

2 个答案:

答案 0 :(得分:1)

Laravel doc示例可能更详细一些

这对您的请求来说有点晚了,但如果这对您仍有帮助,请尝试此操作。我在Laravel流利的时候遇到了非常类似的问题。将所有内容都放入 DB :: select 语句时我遇到的一个问题是我无法将结果上的 - > paginate()方法用作对象没有回来。 此代码将事物保存在DB对象中,允许您对结果使用对象方法,例如 - > paginate(), - > toJson, - > toArray, - > toSql 等。

以下使用的 - > from()方法仅在文档页面上使用ONCE,这是一个模糊的用例,我错过了前10次阅读文档的内容。

我在这结尾处有一个 - > toSql()来获取我在下面发布的实际SQL代码的输出。您可以将其更改为 - > get()以检索您的数据。

      $average = DB::table('temp')
            ->select(DB::Raw('day_of_week, AVG(visitors_sum) average_order'))
            ->from(DB::Raw('(
                  SELECT DAYNAME(play_date) day_of_week,
                         DAYOFWEEK(play_date) day_num,
                         TO_DAYS(play_date) `date`,
                         sum(group_size) visitors_sum
                  FROM reservations
                  GROUP BY `date`
                ) temp'))
            ->groupBy('temp.day_of_week')
            ->orderBy('temp.day_num')
            ->toSql();

这是Laravel 4从上面的代码中流畅生成的实际SQL,它在功能上与原始问题中的原始代码完全相同。

string(457) "select day_of_week, AVG(visitors_sum) average_order from (
                  SELECT DAYNAME(play_date) day_of_week,
                         DAYOFWEEK(play_date) day_num,
                         TO_DAYS(play_date) `date`,
                         sum(group_size) visitors_sum
                  FROM reservations
                  GROUP BY `date`
                ) temp group by `temp`.`day_of_week` order by `temp`.`day_num` asc" 

答案 1 :(得分:0)

Yay - 找到了结果。我结束了这个并且可以使用以下相同的结果:

$average = DB::select(
        'SELECT day_of_week, 
        AVG(visitors_sum) average_order 
        FROM 
            (
              SELECT DAYNAME(play_date) day_of_week, 
                     DAYOFWEEK(play_date) day_num, 
                     TO_DAYS(play_date) `date`,
                     sum(group_size) visitors_sum
              FROM reservations 
              GROUP BY `date`
            ) temp
        GROUP BY day_of_week 
        ORDER BY day_num');

这让我得到了我需要的结果。我认为Select需要一个表,但可以使用原始查询

由于