簡體   English   中英

Laravel:查詢字符串到雄辯的過濾器

[英]Laravel: Query string to Eloquent filter

我需要一個小的函數,它將一個查詢字符串並將其轉換為3個查詢之一:

  • 值和值之間的WHERE列
  • WHERE欄=值
  • (值,值,...)中的WHERE列

這是我目前正在做的事情:

// USE: ?price[between][min]=0&price[between][max]=100&size[in][value]=L&size[in][value]=M

$filters = ['price', 'size'];

$products= Product::query();

foreach($filters as $filter)
{
    if(isset($input[$filter]) && array_filter($input[$filter][key($input[$filter])]))
    {
        sort($input[$filter][key($input[$filter])]);
        $products->{'where' . ucfirst(key($input[$filter]))}($filter, $input[$filter][key($input[$filter])]);
    }
}

return $products->get();

這是我的問題:

  1. 這是一個好方法嗎? 如果是這樣,那么在什么地方適合此邏輯?
  2. 已經有一個軟件包可以處理這種邏輯嗎?
  3. 如果以上都不是,實現此目標的最佳方法是什么?
  1. 我會簡化事情。 至於位置,我會將其放在ProductRepository中(如果您使用Repository Pattern)。 如果不這樣做,我會將其放置在模型內部的函數中。
  2. 我不知道。 沒看到任何東西,但我不是在尋找這樣的東西。
  3. 就個人而言,最好的方法是在存儲庫中創建一個函數,簡化查詢字符串和代碼。

您可能對該查詢字符串有一些問題,因為var_dump會導致以下問題:

array(2) {
    'price' =>
    array(1) {
        'between' =>
        array(2) {
            'min' => string(1) "0"
            'max' => string(3) "100"
        }
    }
    'size' =>
    array(1) {
        'in' =>
        array(1) {
            'value' => string(1) "M"
        }
    }
}

您會看到缺少可變size的值L ,因為它已被M替換。 當然,您可以添加另一個數組,但是如果可以簡化為以下形式:

?price[between]=0,100&size[in]=L,M

無論如何,出於可讀性考慮,我更喜歡此代碼。

$qString = Input::all();

$model = App::make('Product');

$products = $model->where(function($query) use($qString) {
    foreach($qString as $column => $operations) {
        foreach($operations as $operator => $values) {
            switch($operator) {
                case 'between': 
                    $query->whereBetween($column, array($values['min'], $values['max']));
                    break;
                case 'in': 
                    $query->whereIn($column, $values);
                    break;
            }
            // or replace the switch with this:
            // $query->{'where' . ucfirst($operator)}($column, $values);
        }
    }
})->get(); 

請注意,這尚未經過測試(盡管我在Repository方法中使用了閉包並且它們可以工作),您可能需要對此進行一些調整。

另請注意,如果您選擇一個我建議的查詢字符串,則可能需要進行一些驗證。

暫無
暫無

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

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