2016-08-04 15 views
1

Lets sagen, dass ich ein „Student“ -Modell mit Funktionen haben getActive() und getInactive() wie folgt aus:Klassenvariable in Laravel Modell

public static function getActive() 
{ 
    return Student::with(['user', 'country', 'course', 'gender', 'language' => function($q){$q->orderBy('name');}])->where('active', 1)->get(); 
} 

public static function getInactive() 
{ 
    return Student::with(['user', 'country', 'course', 'gender', 'language' => function($q){$q->orderBy('name');}])->where('active', 0)->get(); 
} 

Wie Sie sehen können, ist der einzige Unterschied ist die >where('active', 0) am Ende jeder Abfrage.

Ich versuche, eine globale "Basisabfrage" zu deklarieren, an die ich am Ende die where Bedingung anhängen würde. Etwas wie folgt aus:

$baseQuery; 

public function __construct() 
{ 
    $baseQuery = Student::with(['user', 'country', 'course', 'gender', 'language' => function($q){$q->orderBy('name');}]); 
} 

public static function getActive() 
{ 
    return $baseQuery->where('active', 1)->get(); 
} 

public static function getInactive() 
{ 
    return $baseQuery->where('active', 0)->get(); 
} 

Das würde mich nicht retten nur redundanten Code, es würde auch meinen Code klarer und sichtbar, aber als Neuling machen ich mit dem Code zu kämpfen.

Irgendwelche Ideen?

EDIT 1:

ich es so aus meinem Controller bin Aufruf:

$students = Profile::getActive(); 
+0

Wie rufen Sie es in Ihrem Code? – James

+0

Ich habe meinen Beitrag mit der Antwort auf Ihre Frage bearbeitet –

Antwort

0

können Sie verwenden, bei method.The wobei Methode überprüft, ob eine bestimmte Spalte der Wert innerhalb der enthaltenen Array gegeben:

public static function getInactiveOrInactive() 
{ 
return Student::with(['user', 'country', 'course', 'gender', 'language' => function($q){$q->orderBy('name');}])->->whereIn('active', [0,1])->get(); 
} 
+0

Das ist ein guter Ansatz, aber ich denke, es ist nicht der beste in diesem Szenario, da ich andere Methoden habe, die diese '$ baseQuery' benötigen. –

1

Verwenden Query Scope

public function scopeRetrieve($query) 
{ 
    return $query->with(['user', 'country', 'course', 'gender', 'language'])->orderBy('name'); 
} 

public static function scopeActive($query) 
{ 
    return $query->where('active', 1); 
} 

public static function scopeInactive() 
{ 
    return $query->where('active', 0); 
} 

Sie können es so nennen:

Profile::retrieve()->active()->get(); 
Profile::retrieve()->inactive()->get(); 

Es fördert Wiederverwertbarkeit, da Sie sie in Stücke seiner eigenen, beim nächsten Mal sind zu brechen, wenn Sie mehr Einschränkungen oder Filter haben könnten Sie einfach hinzufügen auf es.