Laravel:用户定义的MySQL变量在Laravel中总是为NULL,但在MySQL CLI中不是

时间:2013-07-30 15:17:07

标签: php mysql sql laravel laravel-4

我有一个嵌套选择的查询,它使用第一个选择的结果。当我使用Sequel Pro的查询检查器测试时,我的查询工作完美。它返回我想要的结果。当我将此查询传递给Laravel并使用简单的echo语句对其进行测试时,它会输出NULL

这是我的PHP代码和查询:

$crons = DB::select('
    SELECT @quiet_crons:=ROUND(SUM(TIME_TO_SEC(TIMEDIFF(`end_time`, `start_time`))/60/15))
    AS quiet_crons,
    FLOOR(SUM(TIME_TO_SEC(TIMEDIFF(TIME('24:00'), TIME(NOW())))/60/15-@quiet_crons))
    AS remaining_crons
    FROM `quiet_periods`
    WHERE `day` = DAYNAME(NOW())
');

这是控制台的输出:

array(1) {
  [0]=>
  object(stdClass)#689 (2) {
    ["quiet_crons"]=>
    string(2) "24"
    ["remaining_crons"]=>
    NULL
  }
}

remaining_crons结果永远不应为NULL

请注意:我在这里看到一篇文章,讨论了Laravel中用户定义的MySQL变量,我尝试了解决方案,但它没有解决我的问题。这是我所指的链接: User-defined MySQL variables in Laravel 3?

2 个答案:

答案 0 :(得分:1)

MySQL用户定义的变量有点棘手。来自the manual;

  

作为一般规则,除了SET语句 之外,您不应该为用户变量赋值并在同一语句中读取值 。例如,要增加变量,这没关系:

     

SET @a = @a + 1;

     

对于其他语句,例如SELECT, ,您可能会得到您期望的结果,但这不能保证 。在下面的语句中,您可能会认为MySQL将首先评估@a然后再进行一次分配:
  ...

您可以在不使用变量的情况下重写语句;

SELECT quiet_crons, 
  FLOOR(SUM(TIME_TO_SEC(TIMEDIFF(TIME('24:00'), TIME(NOW())))/60/15-quiet_crons))
  AS remaining_crons
FROM (
  SELECT ROUND(SUM(TIME_TO_SEC(TIMEDIFF(`end_time`, `start_time`))/60/15))
  AS quiet_crons
  FROM `quiet_periods`
  WHERE `day` = DAYNAME(NOW())
) a;

An SQfiddle to test with

答案 1 :(得分:1)

好的,这有点奇怪,但只要我SET(初始化)变量首先在一个单独的查询中,结果查询在Laravel中工作正常。

这是我在上一段代码上面添加的代码:

$crons = DB::select(DB::raw('
    SET @quiet_crons = 0;
'));

也许有人可以解释为什么这会像Laravel那样工作,当MySQL正确地做它的事情并且无论如何都有效...