[英]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運算符與city
, first_name
, middle_name
或last_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.