簡體   English   中英

生成器中的laravel 5.3原始SQL語句

[英]laravel 5.3 raw SQL statement in Builder

我已經應用了一個laravel構建器來過濾用戶以某種形式輸入的搜索,但是它並不是最佳的。 這是我的情況:

我的表格如下所示: 表格搜索功能

在第一個輸入中是定制查詢搜索,在其中創建以下構建器。

return $builder->where('city', 'LIKE', '%' . $value . '%')
                   ->orWhere('first_name', 'LIKE', '%' . $value . '%')
                   ->orWhere('middle_name', 'LIKE', '%' . $value . '%')
                   ->orWhere('last_name', 'LIKE', '%' . $value . '%');

下面的代碼過濾了3個下拉菜單:

return $builder->where('location', $value); // <-- for "selecteer locatie"
return $builder->where('level', $value); // <-- for "selecteer richting"
return $builder->where('graduation', $value); // <-- for "selecteer diplomajaar"

$ value是用戶的輸入。

現在,只要我按3個下拉選項進行過濾,它就會像魔術一樣起作用。 每當我嘗試將其與第一個過濾器的查詢組合時,它就會顯示比實際所需更多的結果。

因此,第一個查詢給出的是OR語句,這實際上是錯誤。 我想在可以運行的構建器中放置RAW SQL語句

 "WHERE `city` LIKE %" . $value . "% 
 OR `first_name` LIKE %" . $value . " 
 OR `middle_name` LIKE %" . $value . " 
 OR `last_name` LIKE %" . $value . " 

在這些符號之間( 'statement' )

有沒有一種方法可以單獨運行構建器,也可以在laravel 5.3構建器中輸入原始SQL語句?

如果您需要更多信息,請詢問。

編輯:我的問題還不夠清楚! 請參閱下面的說明。

我正在使用Builder類在表單中創建SQL過濾器。 每當我運行高級搜索並轉儲我的Builder時,我都會在+ where子句中獲得帶有以下數組的Builder對象:

+wheres: array:7 [▼
0 => array:5 [▼
  "type" => "Basic"
  "column" => "city"
  "operator" => "LIKE"
  "value" => "%hof%"
  "boolean" => "and"
]
1 => array:5 [▼
  "type" => "Basic"
  "column" => "first_name"
  "operator" => "LIKE"
  "value" => "%hof%"
  "boolean" => "or"
]
2 => array:5 [▼
  "type" => "Basic"
  "column" => "middle_name"
  "operator" => "LIKE"
  "value" => "%hof%"
  "boolean" => "or"
]
3 => array:5 [▼
  "type" => "Basic"
  "column" => "last_name"
  "operator" => "LIKE"
  "value" => "%hof%"
  "boolean" => "or"
]
4 => array:5 [▼
  "type" => "Basic"
  "column" => "location"
  "operator" => "="
  "value" => "Franeker"
  "boolean" => "and"
]
5 => array:5 [▼
  "type" => "Basic"
  "column" => "level"
  "operator" => "="
  "value" => "MAVO"
  "boolean" => "and"
]
6 => array:5 [▼
  "type" => "Basic"
  "column" => "graduation"
  "operator" => "="
  "value" => "1992"
  "boolean" => "and"
]
]

因為我使用OR運算符與cityfirst_namemiddle_namelast_name進行比較, middle_name我應該得到4個where子句,而不是7個 這是因為生成器將第一個輸入中調用的OR語句視為AND語句。

我通過替換它解決了這個問題:

return $builder->where('city', 'LIKE', '%' . $value . '%')
                   ->orWhere('first_name', 'LIKE', '%' . $value . '%')
                   ->orWhere('middle_name', 'LIKE', '%' . $value . '%')
                   ->orWhere('last_name', 'LIKE', '%' . $value . '%');

到這個:

return $builder->where( function($query) use ($value){

    $query->where('city', 'LIKE', '%' . $value . '%')
          ->orWhere('first_name', 'LIKE', '%' . $value . '%')
          ->orWhere('middle_name', 'LIKE', '%' . $value . '%')
          ->orWhere('last_name', 'LIKE', '%' . $value . '%');
});

編輯:死時並轉儲Builder類時轉儲了以下+ where子句

+wheres: array:4 [▼
 0 => array:3 [▼
  "type" => "Nested"
  "query" => Builder {#216 ▶}
  "boolean" => "and"
 ]
 1 => array:5 [▼
  "type" => "Basic"
  "column" => "location"
  "operator" => "="
  "value" => "Franeker"
  "boolean" => "and"
 ]
 2 => array:5 [▼
  "type" => "Basic"
  "column" => "level"
  "operator" => "="
  "value" => "MAVO"
  "boolean" => "and"
 ]
 3 => array:5 [▼
  "type" => "Basic"
  "column" => "graduation"
  "operator" => "="
  "value" => "1992"
  "boolean" => "and"
 ]
]

在數組索引為0的嵌套Builder類中,插入了OR語句。

您的答案應該正確地將地點分組。

對於“如何在Laravel 5.3構建器中輸入原始SQL語句?”

DB::statement($rawStatement)

確保將值作為第二個參數綁定到statement ,也可以使用

DB::statement(DB::raw($rawStatement))

還有

 $query->whereRaw("city LIKE %{$value}%")

這對於輸入某些查詢很有用,但不能解決嵌套查詢問題。

如果您想將所有原始資料制作成原始內容,則必須遵循以下步驟:

$query->whereRaw($mainQuery)
->setBindings([$city, $first_name, $middle_name,  $last_name])

主查詢如下所示:

"(city LIKE ? OR first_name LIKE ? OR middle_name LIKE ? OR last_name LIKE ?)"

然后,您可以將原始篩選查詢附加到該字符串

"AND location = ?"

暫無
暫無

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

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