2016-09-08 25 views
0

Ich habe 4 Tabellen.Eloquent Beziehung mit DB Laravel

Clients Jobs Runden Job_Rounds

Ich habe folgende Beziehungen erstellt:

Clients > Jobs 
Jobs > Rounds 

Hier sind meine Modelle

Kunde

class Client extends Model 
{ 

    protected $dates = [ 
     'created_at', 
     'updated_at', 
     'last_done' 
    ]; 


    public function Jobs() 
    { 
     return $this->hasMany('App\Job','client_id'); 
    } 
} 

Job

class Job extends Model 
{ 
    protected $dates = [ 
     'created_at', 
     'updated_at', 
     'last_done', 
     'due_date' 
    ]; 

    public function Round() 
    { 
     return $this->belongsTo('App\Round','round_id'); 
    } 

    public function Client() 
    { 
     return $this->belongsTo('App\Client','client_id'); 
    } 
} 

Runde

class Round extends Model 
{ 
    protected $dates = [ 
     'created_at', 
     'updated_at', 
     'date_scheduled', 
     'date_finished' 
    ]; 

    public function Clients() 
    { 
     return $this->hasMany('App\RoundClients', 'round_id'); 
    } 

    public function Jobs() 
    { 
     return $this->belongsToMany('App\Job', 'job_rounds', 'round_id', 'job_id'); 
    } 
} 

JobRound

class JobRound extends Model 
{ 
    public $timestamps = false; 
} 

Auf meinem Rundblick ich alle Jobs nicht in der Runde bin ausgeben und all Jobs in der Runde.

ich das tue, indem ein DB :: Tabelle erstellen, die Prüfung durchzuführen - meinen Code sehen:

public function show($id) 
    { 
     $round = Auth::user()->rounds()->FindOrFail($id); 

     $not = DB::table('jobs')->whereNotIn('id', function($query) use($round) { 
     $query->select('job_id') 
      ->from('job_rounds') 
      ->where('round_id', $round->id); 
     })->get(); 

     $are = DB::table('job_rounds') 
     ->join('jobs', 'job_rounds.job_id', '=', 'jobs.id') 
     ->select('job_rounds.*', 'jobs.*' ,'job_rounds.id as DAS') 
     ->where('job_rounds.round_id',$round->id) 
     ->get(); 

     return view('app.round',compact('round','not','are')); 
    } 

Das Problem, das ich habe in meiner Ansicht ist, die Client-Job Beziehung für den Client ausgeben Name wird nicht funktionieren, wie ich meine eigene DB-Abfrage erstellt haben, ich bin Ausgabe der Client-Informationen auf meiner Ansicht wie

Jobs auf dem runden

@foreach($are as $job) 
    {{ $job->client->first_name }} 
@endforeach 

Jobs nicht auf dem runden

@foreach($not as $job) 
    {{ $job->client->first_name }} 
@endforeach 

bekomme ich den Fehler:

Variable $client not found etc

+0

haben Sie die Beziehung auf den Modellen definiert? Können Sie die Modelldateien für jede – Carlos

+0

@Carlos posten Ich bin nicht vertraut damit, es in der Beziehung zu tun, ich habe die oben genannten Modelle enthalten. –

+0

Warum nicht grundlegende Beziehungen auf Datenbankebene verwenden? – Sachith

Antwort

2

beginnt Ihre Beziehungen Methoden mit Groß (die btw sollten Sie mit Klein für Standard starten ändern).

Das Problem ist, dass Ihre Methoden und die, die Sie nennen, sind nicht die gleichen, Sie denselben Fall in beide verwenden müssen, wie dieser ...

@foreach($are as $job) 
    {{ $job->Client->first_name }} 
@endforeach 

aktualisieren

Neben Tatsache ist, dass Sie Eloquent nicht verwenden.
Sie verwenden nur den Datenbank-Abfrage-Generator direkt.
Um Eloquent verwenden Sie die Modell-Klasse statische Methoden, wie diese verwenden müssen:

Job::whereNoIn('id', ..... 

Statt dessen:

DB::table('jobs')->whereNotIn('id', .... 
+0

Danke Nestor, ich habe versucht, aber ich bekomme immer noch die Undefined-Eigenschaft: stdClass :: $ Client –

+1

Ohh, ich sehe, Sie verwenden nicht eloquent, deshalb. Sie verwenden den Datenbankabfrage-Generator. Wenn Sie Eloquent verwenden möchten, müssen Sie die statischen Methoden der Klasse aufrufen, wie 'Job :: whereNotIn (.....' anstelle von 'DB :: table ('jobs') '.) Wenn Sie nicht Eloquent verwenden, Diese Beziehungen sind nicht verfügbar. –

+0

Das funktionierte wie ein Charme! Danke –

2

DB::table nicht zurück eine App\Job Klasse. Aus diesem Grund können Sie keine Beziehung verwenden. ($job->Client ...)

Versuchen Sie, die Abfragen mit Eloquent statt.Für weitere Details, folgen Sie dieser offiziellen Laravel documantation.

Verwandte Themen