簡體   English   中英

Laravel 查詢生成器原始 AND 語句

[英]Laravel query builder raw AND statement

我需要在 Laravel 中運行原始 SQL 查詢部分。

原始 SQL 基本上如下所示:

AND (forretningsadresse_fylke = 'HEDMARK' 
    AND (forretningsadresse_kommune = 'HAMAR') 
    OR (forretningsadresse_kommune = 'ELVERUM')
) 
OR (forretningsadresse_fylke = 'HORDALAND' 
    AND (forretningsadresse_kommune = 'BERGEN')
) 

我嘗試使用:

$result = Company::where(function($a) use($input, $sql) {

        // Name or keywords LIKE string
        $a -> where('navn', 'LIKE', '%'. $input['query_string'] .'%');
        $a -> where('keywords', 'LIKE', '%'. $input['query_string'] .'%');
        if (!empty($sql)) {
            $a -> where(DB::statement($sql));
        }

    });

    $result = $result -> take($input['limit'])       // Take $limit
                      -> offset($input['offset'])    // Offset by $offset
                      -> orderBy('rank', 'DESC')     // Sponsors first
                      -> get();  

但它不起作用。 請參閱下面的錯誤。 我如何讓這個工作? 提前致謝!

Connection.php 第 673 行中的 QueryException:SQLSTATE[42000]:語法錯誤或訪問沖突:1064 您的 SQL 語法有錯誤; 檢查與您的 MariaDB 服務器版本相對應的手冊,了解在第 1 行的“AND (forretningsadresse_fylke = 'AKERSHUS')' 附近使用的正確語法(SQL: AND (forretningsadresse_fylke = 'AKERSHUS'))

編輯:該表有 100 萬行,我使用此方法創建原始查詢: http : //i.imgur.com/Q5SRP58.png

您的代碼有兩個問題:

  1. 您在應該使用DB::raw地方使用DB::statement DB::statement將執行您作為參數傳遞的字符串,這不是您需要的。 您需要傳遞要包含到查詢構建器的原始語句。
  2. 假設您發布的原始塊是$sql參數,那么您需要刪除起始AND ,否則查詢將以.... and AND ( ,這將引發錯誤。

鑒於此,您需要將代碼更新為:

// Notice the removal of the `AND`
$sql = "(forretningsadresse_fylke = 'HEDMARK' 
        AND (forretningsadresse_kommune = 'HAMAR') 
        OR (forretningsadresse_kommune = 'ELVERUM')
    ) 
    OR (forretningsadresse_fylke = 'HORDALAND' 
        AND (forretningsadresse_kommune = 'BERGEN')
    )";

$result = Company::where(function($a) use($input, $sql) {
    // Name or keywords LIKE string
    $a->where('navn', 'LIKE', '%'. $input['query_string'] .'%');
    $a->where('keywords', 'LIKE', '%'. $input['query_string'] .'%');
    if (!empty($sql)) {
        // Using DB::raw instead of DB::statement
        $a->where(DB::raw($sql));
    }
});

嘗試

$result = Company::where('navn', 'LIKE', '%'. $input['query_string'] .'%')
    ->where('keywords', 'LIKE', '%'. $input['query_string'] .'%')
    ->where(function($query){
        $query->where('forretningsadresse_fylke', '=', 'HEDMARK' )
              ->where('forretningsadresse_kommune', '=', 'HAMAR')
              ->orWhere('forretningsadresse_kommune','=', 'ELVERUM');
    })
    ->where(function($query){
        $query->orWhere('forretningsadresse_fylke','=', 'HORDALAND')
              ->where('forretningsadresse_kommune', '=', 'BERGEN');
   })
   ->take($input['limit'])       // Take $limit
   ->offset($input['offset'])    // Offset by $offset
   ->orderBy('rank', 'DESC')     // Sponsors first
   ->get();  

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM