2016-03-14 2 views
1

Я использую Laravel для API и пытаюсь извлечь несколько переменных _GET, которые пользователь будет вводить.

код выглядит следующим образом, когда используются все фильтры:

public function MUIntervalAPICall(Request $dte) 
    { 
     $date = $dte->dte; 
     $element_language = $dte->language; 
     $element_customer = $dte->customer; 
     $element_contract = $dte->contract; 
     $element_subcontract = $dte->subcontract; 
     $element = $dte->element; 

     //all filters 

     if(isset($_GET['customer']) && isset($_GET['language']) && isset($_GET['contract']) && isset($_GET['subcontract']) && isset($_GET['element'])) 
     { 
     $where = ['dte' => $date, 'element_language' => $element_language, 'element_customer' => $element_customer, 'element_contract' => $element_contract, 'element_subcontract' => $element_subcontract, 'element' => $element]; 
     } 

     $mu_interval = MUInterval::select('element_customer', 'element_contract', 'element_subcontract', 'element_language', 'element_site', 'element', 'src_id', 'src_type_id', 'dte', 'intvl', 'val_src_id', 'exception_name', 'duration_seconds', 'duration_fte') 
      ->where($where) 
      ->get()->toArray(); 
     function array_to_xml($data, &$xml_data) { 
      foreach($data as $key => $value) { 
       if(is_array($value)) { 
        $key = 'Exception'; 
        $subnode = $xml_data->addChild($key); 
        array_to_xml($value, $subnode); 
       } else { 
        $xml_data->addChild("$key",htmlspecialchars("$value")); 
       } 
      } 
     } 
     $xml_data = new SimpleXMLElement('<?xml version="1.0"?><muExceptions></muExceptions>'); 
     array_to_xml($mu_interval,$xml_data); 
     $result = $xml_data->asXML(); 
     return Response::make($result, '200')->header('Content-Type', 'text/xml'); 
    } 

Теперь пользователь хотел бы отфильтровать его только несколько переменных в месте. например дату и клиент, или только язык и контракт. В настоящее время я пишу длинный блок, если-иначе заявления для получения результатов (очень долго, чтобы включать в себя все возможности для шести $ _GET переменных):

elseif(isset($_GET['subcontract']) && isset($_GET['element'])) 
     { 
     $where = ['dte' => $date, 'element' => $element, 'element_subcontract' => $element_subcontract]; 
     } 

Есть ли более короткий способ для такого длительного If- else заявления?

+0

Пожалуйста, смотрите мой ответ на http://stackoverflow.com/questions/35431412/creating-a-filterable-list-using-laravel-and-eloquent-queries/35433377#35433377 Это может помочь абстрагировать логика вашей фильтрации в класс. – Mysteryos

ответ

0

Напишите свои условия, как показано ниже: -

if(isset($_GET['subcontract'],$_GET['element']) && !isset($_GET['customer'], $_GET['language'], $_GET['contract'])){ 
    $where = ['dte' => $date, 'element' => $element, 'element_subcontract' => $element_subcontract]; 
} 

elseif(isset($_GET['customer'], $_GET['language'], $_GET['contract'], $_GET['subcontract'],$_GET['element'])){ 
    $where = ['dte' => $date, 'element_language' => $element_language, 'element_customer' => $element_customer, 'element_contract' => $element_contract, 'element_subcontract' => $element_subcontract, 'element' => $element]; 
} 

Предложение: - Вы должны использовать Validator Class Laravel для валидаций.

См. Ниже ссылки.

http://www.sitepoint.com/data-validation-laravel-right-way/

https://laravel.com/docs/5.1/validation

0
  1. isset принимает несколько аргументов сразу:

    if (isset($_GET['customer'], $_GET['language'], $_GET['contract'], ...)) 
    
  2. Вы можете использовать массив перекрестки/Diffs:

    if (!array_key_diff(array_flip(['customer', 'language', ...]), $_GET)) 
    

    Если array_key_diff возвращает пустой массив, все эти ключи существуют в массиве $_GET.

Смежные вопросы