2017-12-08 3 views
0

abfragen Ich arbeite an einem Projekt. Für jetzt sagen wir, ich habe 3 Tabellen "districts", "crimes" and "cases". Die Falltabelle enthält alle registrierten Fälle.Wie Sie dies mit Laravel 5.5

Case.php (EDIT: fehlendes Zitat)

class Case extends Model 
{ 
    protected $table = 'cases'; 
    protected $fillable = ['person_name','crime_id' ,'district_id','crime_date']; 

    public function crime() 
    { 
     return $this->belongsTo('App\Crime'); 
    } 

} 

District.php

class District extends Model 
{ 
    protected $table = 'districts'; 
    protected $fillable = ['name']; // name of districts like "A district","B district" etc. 

    public function cases() 
    { 
     return $this->hasMany('App\Case'); 
    } 
} 

Crime.php

class Crime extends Model 
{ 
    protected $table = 'crimes'; 
    protected $fillable = ['name']; // name of different types of crime like rape, murder etc. 
} 

Mein Ausgang am Ende des Monats sollte folgendermaßen aussehen unten im report.blade.php für zB: Totaler Verbrechen in einem Bezirk im Dezember, Gesamtverbrechen des B Bezirkes in Dezember, Totalverbrechen des Bezirks C im Dezember. Simillary für alle Bezirke in jedem Monat (Januar-Dezember eines jeden Jahres)

District name | total crime | crime 
    A    3    rape 
           murder 
           attempt to murder 

    B    1    rape 

    C    0    No crime reported 

// dh: oben sind die Daten für Dezember Monat 2017 in jedem Bezirk

Controller: Ich brauche diese Abfrage zu ändern oben Ausgabe zu erhalten, da diese in jedem Bezirk insgesamt Verbrechen und Verbrechensarten geben, aber unabhängig von jedem Monat

public function index(){ 
    $districts = District::with('cases.crime')->get(); 
    return $districts; 
} 

auf Rückkehr bekam ich diesen

[ 
{ 
id: 1, 
name: "A",//name of district 
created_at: "-0001-11-30 00:00:00", 
updated_at: "-0001-11-30 00:00:00", 
cases: [ //registered cases 
    { 
    id: 1, 
    crime_id: 1, 
    district_id: 1, 
    crime_date: "2017-12-31 00:00:00", 
    created_at: "-0001-11-30 00:00:00", 
    updated_at: "-0001-11-30 00:00:00", 
crime: {//name of crime from crimes table 
id: 1, 
name: "Rape", 
created_at: "-0001-11-30 00:00:00", 
updated_at: "-0001-11-30 00:00:00" 
} 
}, 
{ 
id: 3, 
crime_id: 4, 
district_id: 1, 
crime_date: "2017-12-31 00:00:00", 
created_at: "-0001-11-30 00:00:00", 
updated_at: "-0001-11-30 00:00:00", 
crime: { 
id: 4, 
name: "Women trafficking", 
created_at: "-0001-11-30 00:00:00", 
updated_at: "-0001-11-30 00:00:00" 
} 
}, 
{ 
id: 4, 
crime_id: 3, 
district_id: 1, 
crime_date: "2017-12-31 00:00:00", 
created_at: "-0001-11-30 00:00:00", 
updated_at: "-0001-11-30 00:00:00", 
crime: { 
id: 3, 
name: "Murder", 
created_at: "-0001-11-30 00:00:00", 
updated_at: "-0001-11-30 00:00:00" 
} 
} 
] 
}, 
{ 
id: 2, 
name: "B",//name of district from districts table 
created_at: "-0001-11-30 00:00:00", 
updated_at: "-0001-11-30 00:00:00", 
    cases: [ 
    { 
    id: 2, 
    crime_id: 1, 
    district_id: 2, 
    crime_date: "2017-12-31 00:00:00", 
    created_at: "-0001-11-30 00:00:00", 
    updated_at: "-0001-11-30 00:00:00", 
    crime: { 
    id: 1, 
    name: "Rape", 
    created_at: "-0001-11-30 00:00:00", 
    updated_at: "-0001-11-30 00:00:00" 
} 
} 
] 
} 
] 

Antwort

0

Dies kann Ihnen helfen:

$districts = District::with(['cases' => function ($query) use($startDate, $endDate) { 
    $query->whereBetween('crime_date', [$startDate, $endDate]); 
}, 'cases.crime'])->get(); 

Konstrukt $startDate und $endDate aus dem Monat und Jahr.

für weitere Informationen einen Blick auf diese: https://laravel.com/docs/5.5/eloquent-relationships#eager-loading (Einschränkende Eager Lasten Abschnitt)