2016-05-02 4 views
0

Ich erstelle eine API in Lumen zu erzeugen, und ich brauche, ein Verfahren zu schaffen, die stammt aus zwei columsauf dem gleichen Tisch bekommen und geben Sie alle Jahre, die zwischen diesen Daten auftreten, alle als ein einzelnes Array zurück.Wie eine Liste der einzigartigen Jahren zwischen mehreren Terminen in Lumen/Laravel

So zum Beispiel, stellen Sie sich eine Tabellenspalte namens start_date und einen anderen Namen end_date

start_date | end_date   getAllYears() should return => 
           [1983, 1984, 1985, 1986, 1987, 
           1999, 2000, 2001, 2002, 2003, 
           ..., 2016] 
1999-05-09 | 2002-04-03 
1983-03-12 | 1987-09-23 
2001-02-12 | 2016-11-27 

Zur Zeit habe ich eine Methode, die dies auf andere Arten von spezifischeren Abfragen, das Hauptproblem bei diesem Versuch zu tun, schafft, ist, dass aufgrund der Masse der SQL-Datensätze, die ich abrufe, eine Methode wie diese meine Anfrage veranlasst, jedes Mal eine Zeitüberschreitung auszuführen.

MY ineffiziente Methode , die wenig Gebrauch von Lumen/Laravel

public function getAllYears(){ 
    $dates = $this->model->select('data_ini', 'data_fim')->get(); 

    $results = []; 

    foreach ($dates as $obj){ 
     $carbonBegin = Carbon::createFromDate($obj->data_ini->year); 
     $carbonEnd = Carbon::createFromDate($obj->data_fim->year); 

     if($carbonEnd->year === 9999){ 
      $carbonEnd->year = date('Y'); 
     } 

     $carbonEnd->year++; 
     // Simple method that runs a DatePeriod method 
     $dateRange = $this->helper->createDateRange($carbonBegin, $carbonEnd); 

     $results = array_merge($results, $dateRange); 
    } 
    sort($results); 
    $cleanYears = array_unique($results); 

    if ($cleanYears == null) 
     return response()->json(['error' => true, 'errorCode' => '1008', 'message' => "No years found!"]); 
    else 
     return response()->json(['error' => false, 'years' => $cleanYears]); 
} 

So macht, ist die Frage, wie kann ich dies tun, in eine weniger teure Art und Weise, so dass mein Server nicht Zeit auf jede Anfrage? Vielen Dank im Voraus für Ihre Hilfe :)

HINWEIS: DB: roh ist ein No-Go, wie meine TL mich verwenden es überall auf der API

Antwort

0

wie Sie die whereBetween brauchen Sieht verboten hat:

$between = DB::table('theTable')->whereBetween('data_ini', ["str_to_date('2011-05-06','%Y-%m-%d')", "str_to_date('2011-05-06','%Y-%m-%d')"])->get(); 

Mit Modellen:

$between = $this->model->whereBetween('data_ini', ["str_to_date('2011-05-06','%Y-%m-%d')", "str_to_date('2011-05-06','%Y-%m-%d')"])->get(); 

im oben, ich bin mit Hilfe von MySQL eingebaut str_to_date

Hope this hilft!

+0

Sie liegen nicht falsch, aber Sie benötigen unformatierte Abfragen, um mysql-Funktionen zu verwenden. –

+0

Großartig, das sieht so aus, als könnte es funktionieren, ich muss nur min und max Jahre vorher analysieren und weiterleiten, aber ich habe ein anderes Problem, in meiner 'data_fim'-Spalte haben einige der Daten das Jahr' 9999 ' soll auf das aktuelle Jahr umgestellt werden, eine einfache Möglichkeit, dies mit Query Builder zu tun? – JonnySerra

Verwandte Themen