問題描述
我想根據我從 json 對象收集的搜索參數構建一系列雄辯的 WHERE 子句.
I would like to construct a series of eloquent WHERE clauses dependent on the search parameters I collect from a json object.
像這樣的東西(不管對象的語法,,,它是一種解釋,只是為了演示):
Something like this (never mind the syntax of object,,, it is an interpretation only to demonstrate):
$searchmap = "
{
"color": "red",
"height": "1",
"width": "2",
"weight": "",
"size": "",
}";
然后我取對象并解碼以獲得搜索數組...
I then take the object and decode to get a search array...
$search = json_decode($searchmap, true);
如果我的權重和大小設置為 null 或者是一個空字符串",我會有像這樣的雄辯代碼..
If my weight and size are set to null or are an 'empty string' I would have eloquent code that looks like this..
$gadgets = Gadget::where('color', '=', $search['color'])
->where('height', '=', $search['height'])
->where('width', '=', $search['width'])
->paginate(9);
如果它們有一個值,那么雄辯的代碼看起來像這樣..
If they have a value then eloquent code would look like this..
$gadgets = Gadget::where('color', '=', $search['color'])
->where('height', '=', $search['height'])
->where('width', '=', $search['width'])
->where('weight', '=', $search['weight'])
->where('size', '=', $search['size'])
->paginate(9);
有沒有辦法動態地實現這一點.
Is there a way to accomplish this dynamically.
我想問題應該在于有沒有辦法根據給定的參數動態鏈接雄辯的 where 子句?
I suppose the question should be ins there a way to chain eloquent where clauses dynamically based on a given parameter?
在偽上下文中,我希望做這樣的事情
In a pseudo context I am looking to do something like this
$gadgets = Gadget::
foreach ($search as $key => $parameter) {
if ( $parameter <> '' ) {
->where($key, '=', $parameter)
}
}
->paginate(9);
是否可以以類似于此的方式創建 where 子句的鏈接?
Can chaining of where clauses be created in some way similar to this?
感謝您花時間看這個!
更新:
我也想出了類似這樣的東西,似乎效果很好,但如果改進是個好主意,我歡迎提出建議.
I also came up with something like this that seems to work well but i would like to welcome suggestions if improvement is a good idea.
$gadgets = New Gadget();
foreach ($search as $key => $parameter) {
if($parameter != ''){
$gadgets = $gadgets->where($key, '=', $parameter);
}
}
$gadgets = $gadgets->paginate(9);
<小時>
最終版
感謝下面的@lukasgeiter,我想我會選擇這個
And thanks to @lukasgeiter below I think I will go with this
$gadgets = Gadget::whereNested(function($query) use ($search) {
foreach ($search as $key => $value)
{
if($value != ''){
$query->where($key, '=', $value);
}
}
}, 'and');
$gadgets = $gadgets->paginate(9);
推薦答案
這很簡單.Laravel 的 where
函數允許你傳入一個鍵值對數組.
That's easy. Laravel's where
function allows you to pass in an array of key value pairs.
$searchmap = array(
'color' => 'red',
'height' => '1'
// etc
);
$gadgets = Gadget::where($searchmap)->paginate(9);
如果你好奇,那是源代碼的相關部分 (IlluminateDatabaseQueryBuilder
)
If you are curious, that's the relevant part of the source (IlluminateDatabaseQueryBuilder
)
public function where($column, $operator = null, $value = null, $boolean = 'and')
{
// If the column is an array, we will assume it is an array of key-value pairs
// and can add them each as a where clause. We will maintain the boolean we
// received when the method was called and pass it into the nested where.
if (is_array($column))
{
return $this->whereNested(function($query) use ($column)
{
foreach ($column as $key => $value)
{
$query->where($key, '=', $value);
}
}, $boolean);
}
// many more lines of code....
}
編輯
要對其進行更多控制(例如,將="更改為另一個比較運算符),請嘗試直接使用 Laravel 內部使用的代碼:
Edit
To have more control over it (e.g. changing the "=" to another comparison operator) try using the code laravel uses internally directly:
$gadgets = Gadget::whereNested(function($query) use ($searchmap)
{
foreach ($searchmap as $key => $value)
{
if($value != ''){
$query->where($key, '=', $value);
}
}
}, 'and')->paginate(9);
這篇關于Laravel - 根據動態參數擴展 Eloquent where 子句的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!