2016-11-23 11 views
2

Ich habe zwei Datetime-Spalten in meiner Tabelle - from_date und to_date. Ich muss Datensätze erhalten, in denen das Jahr von "from_date" oder "to_date" das aktuelle Jahr ist. Ich versuche, die Datensätze mit whereYear und ich steckenWie schreibe ich oder WhereYear() in Laravel

$table_records = TableName::whereYear('from_date' , '=', date('Y'))->orWhereYear('to_date' , '=', date('Y'))->orderBy('from_date')->get(); 

am Oder-Bedingung bin zu bekommen, aber natürlich gibt es keine orWhereYear in Laravel, denke ich. Kann mir bitte jemand bei der Abfrage helfen.

+0

Wenn Sie bereit zu schreiben rohe SQL sind, könnten Sie $ table_records mit wegkommen = DB :: wählen ( „select * from table_name WHERE YEAR (from_date) = YEAR (CURDATE()) ODER JAHR (to_date) = YEAR (CURDATE()) ORDER BY from_date " ); Beachten Sie, dass dies nur MySQL ist – Vivek

+0

natürlich wird das sicherlich funktionieren, aber ich will nur versuchen, wenn es funktioniert, indem es zu vermeiden, um alles eine rohe Abfrage –

Antwort

5

Ein Weg, es zu tun so sein würde:

$table_records = TableName::whereYear('from_date' , '=', date('Y')) 
    ->whereYear('to_date' , '=', date('Y'), 'or') 
    ->orderBy('from_date') 
    ->get(); 
+1

Nizza, besser als meine Antwort. Habe diesen 4. Parameter in der API nicht bemerkt. https://laravel.com/api/5.3/Illuminate/Database/Query/Builder.html#method_whereYear –

1

Sie einen Verschluss mit orWhere() verwenden können.

TableName::whereYear('from_date','=', date('Y')) 
      ->orWhere(function($query) { 
        return $query->whereYear('to_date', '=', [date('Y')]); 
      })->get(); 

Die resultierende parametrisierte SQL:

select * from "table_name" where (extract(year from "from_date") = ? or (extract(year from "to_date") = ?)) and "table_name"."deleted_at" is null 
+0

zu schlecht kann ich zwei Antworten nicht annehmen, ich denke, aber vielen Dank Kumpel –

+0

Die andere Antwort ist besser als meins. Dennoch ist die Schließung von orWhere sehr nützlich. –

1

ich ein bisschen zu ausprobiert und kam mit diesem

$table_records = TableName::where(DB::raw("year(from_date)"), '=', date('Y')) 
    ->orWhere(DB::raw("year(to_date)"), '=', date('Y')) 
    ->orderBy('from_date')->get(); 
0

Sie können nicht OrWhereYear verwenden, aber man konnte den vierten Parameter verwenden von whereyear wie so:

->whereYear('to_date' , '=', date('Y'), 'or') 

oder alternativ:

->where(function($q){ 
    $q->whereyear('from_date' , '=', date('Y')) 
})->orwhere(function($q){ 
    $q->whereyear('to_date' , '=', date('Y')) 
}) 
Verwandte Themen