2016-08-25 5 views
1

Ich arbeite an einer BDS (Blood Donation Society) -Funktion für meine Universität Website. Jetzt stehe ich vor einem Problem mit der Beschaffung der verfügbaren Spender, d. H. Spender, die in den letzten 3 Monaten oder 6 Monaten kein Blut gespendet haben. Im Anschluss ist mein Code:Ich kann keine Blutspender in Laravel bekommen

Donor-Klasse wie folgt:

public function allDonors() 
{ 
    $donors = Donor::getAvailableDonors(); 
    return view('BDS/allDonors',compact('donors')); 
} 

Jetzt weiß ich, dass ich eine nicht statische Methode statisch bin Aufruf, aber:

protected $fillable = [ 
    'name', 
    'email', 
    'address', 
    'area', 
    'mobile', 
    'blood_group', 

]; 

public function getLastDonation() 
{ 
    return DonorRecord::all()->where('donor_id',$this->id)->pluck('donation_date'); 
} 

public function getAvailableDonors() 
{ 
    $current = Carbon::now(); 
    return Donor::all()->where($this->getLastDonation(),'<=',$current->addMonths(3)); 
} 

unter meinem Controller-Code ist Was ich nicht weiß ist, wie ich es umgehen kann.

Was ich bereit bin zu erreichen ist, dass Spender bekommen, die Blut für die letzten 3 Monate nicht gespendet haben und es zur Ansicht schicken. Auch in der Methode getLastDonation() bin ich mir nicht sicher, ob ich die richtige Abfrage verwende.

Folgendes ist mein DonorRecord Model/Class.

+3

vielleicht 'zurück Donor :: all() -> wo ('donation_date', '<=', $ current-> subMonths (3));' – neuronet

+0

$ zeit = Carbon :: now() -> subMonth (3); zurückgeben Donor :: all() -> where ($ this-> getLastDonation(), '<', $ time); Ich habe versucht, dies hinzuzufügen, aber es wird auch nicht funktionieren. Es gibt ein leeres Array zurück. Wohingegen es 2 Aufzeichnungen zurückgeben sollte. –

+0

Sie sollten 'all()' nicht verwenden, wenn Sie nicht alle wollen.Filtere es vor dem Holen: 'Donor :: where ('donation_date', '<=', $ current-> subMonths (3)) -> get();' –

Antwort

2

Ich kann aufgrund niedriger Reputation nicht kommentieren, da es immer viele Möglichkeiten gibt, dies zu tun.

Aber vorausgesetzt, Sie haben eine Beziehung zwischen Spendern und Spender Rekord würde ich dies tun.

DonorRecord:

public function scopeAvailableDonors($query) 
{ 
    //Making an assumption here that you wanted more than three months ago, not three months in the future; 
    $before = Carbon::now()->subMonths(3); 
    return $query->where('donation_date','<=', $before); 
} 

Controller-Code:

public function allDonors() 
{ 
    $donors = DonorRecord::AvailableDonors()->get(); // Or even better DonorRecord::AvailableDonors->with('Donor')->get(); 
    return view('BDS/allDonors',compact('donors')); 
} 

Edit:

Scopes ermöglicht es Ihnen, gemeinsame Abfragen vordefinieren speichern Sie sie immer wieder in Steuerungen und anderen Bereichen des Code zu schreiben .

die einen Umfang Verwendung gilt nur Einschränkungen auf Ihre vorhandene Abfrage, so dass es wie oben verwendet, ist das gleiche wie das Schreiben,

public function allDonors() 
{ 
    $donors = DonorRecord::where('donation_date','<=',Carbon::now()->subMonths(3)); 
    return view('BDS/allDonors', compact('donors')); 
} 

Es ermöglicht Ihnen nur die Logik aus dem Regler und in das Modell zu bewegen, Dies ist möglicherweise nicht angemessen, wenn es nicht häufig verwendet wird, da es Ihr Modell überladen wird (wenn Sie viele davon verwenden).

Zuvor versuchten Sie, eine nicht statische Methode als statische Methode aufzurufen und $ this zu referenzieren, $ dies existiert nicht in einem statischen Kontext.

App\Donor::with(['donorrecord' => function ($query) { 
    $query->where('donation_date', '<=', Carbon::now()->subMonths(3)); 
}])->get(); 

, die die gleichen, aber von der Geberseite tut und nicht der Spender Aufzeichnungsseite:

Ebenso in Ihrem Controller Sie dies getan haben könnte.

+0

Nun, es hat das Problem gelöst. Aber ich bin mir nicht sicher, wie es funktioniert. Kannst du es bitte ein bisschen beschreiben? –

+0

@Jamie Holcroft gibt es ein Problem im Bereich, warum? weil das viele Datensätze pro Spender zurückgeben wird (Notwendigkeit von groupBy) und gefährlicher ist, dass es Spender zurückgibt, die zum Beispiel gestern und vor 4 Monaten gespendet haben !! – Maraboc

+0

@Maraboc Im Moment seine wiederkehrenden Spender, die vor 3 Monaten und davor gespendet haben. Und es gibt viele Aufzeichnungen pro Spender. Ich möchte die letzte Spenderspende bekommen. –

Verwandte Themen