【问题标题】:Laravel 5 issue with executing query with DB::selectLaravel 5 使用 DB::select 执行查询的问题
【发布时间】:2016-10-13 13:47:51
【问题描述】:

我有一个在 phpmyadmin sql 中完美运行的查询,但是当我尝试在 laravel 5 DB::select 中运行查询时,它给了我一个错误,代码如下:

public function getCheckDueCurrentMonth()
    {
        $query = "SELECT * FROM history_card WHERE DUE_CAP_CHECK_DATE BETWEEN  NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY) WHERE MAX(HISTORY_ID) GROUP BY  SERIAL_NUMBER ORDER BY DUE_CAP_CHECK_DATE DESC";

        $results = DB::select( DB::raw($query)); 
        return $results;


    }

这是错误:

QueryException in Connection.php line 761:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL 
 syntax; 
check the manual that corresponds to your MariaDB server version for the right syntax to 
use near 
'WHERE MAX(HISTORY_ID) GROUP BY SERIAL_NUMBER ORDER BY DUE_CAP_CHECK_DATE DESC)' 
at line 1 (SQL: (SELECT * FROM history_card WHERE DUE_CAP_CHECK_DATE BETWEEN NOW() 
AND DATE_ADD(NOW(), INTERVAL 30 DAY) WHERE MAX(HISTORY_ID) 
GROUP BY SERIAL_NUMBER ORDER BY DUE_CAP_CHECK_DATE DESC))

【问题讨论】:

  • 您只需要一个 WHERE。将第二个更改为 AND/OR,并给它一些可比较的东西。

标签: php mysql laravel laravel-5 laravel-5.2


【解决方案1】:

使用这个

public function getCheckDueCurrentMonth()
        {
            $query = "SELECT * FROM history_card WHERE DUE_CAP_CHECK_DATE BETWEEN  NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY) WHERE MAX(HISTORY_ID) GROUP BY  SERIAL_NUMBER ORDER BY DUE_CAP_CHECK_DATE DESC";

            $results = DB::Raw($query); 
            return $results;


        }

【讨论】:

    【解决方案2】:

    首先,您的查询是错误的。正如我在评论中提到的,查询只能有 1 个 WHERE。用 AND 或 OR 连接多个子句。

    $query = "SELECT * FROM history_card 
        WHERE DUE_CAP_CHECK_DATE BETWEEN  NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)     
        AND MAX(HISTORY_ID) 
        GROUP BY  SERIAL_NUMBER 
        ORDER BY DUE_CAP_CHECK_DATE DESC";
    

    我猜你只想要最后一个 history_id,所以你需要将它添加到比较中:

    $query = "SELECT * FROM history_card 
        WHERE DUE_CAP_CHECK_DATE BETWEEN  NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY) 
        AND history_id = MAX(HISTORY_ID) 
        GROUP BY  SERIAL_NUMBER 
        ORDER BY DUE_CAP_CHECK_DATE DESC";
    

    DB::raw 通常在您使用DB::select()->where().... 进行列比较或 MySQL 函数时使用,因此您可以将其放在这里。

    $results = DB::select( $query);
    

    【讨论】:

    • SELECT * FROM history_card WHERE DUE_CAP_CHECK_DATE BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY) AND history_id = MAX(HISTORY_ID) 这个查询给了我错误:无效使用组函数
    【解决方案3】:

    原来 laravel 5 在 MySQL 中使用了“严格模式”,如果你想禁用它,请转到 MySQL 中的 database.php 找到 'strict' => true 并将其转为 'strict' => false

    【讨论】:

    • 我在 laravel 5.1 和 mysql 5.7 中有同样的问题。在 database.php 中严格已经是错误的.. 任何其他解决方案
    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 2013-01-05
    • 2017-11-17
    • 2020-03-27
    • 1970-01-01
    • 2017-10-20
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多