2016-11-10 3 views
1

Ich habe eine DeliveryForecast-Modell, und ich muss ein eloquent erstellen, um Daten aus mehreren Tabellen basierend auf 2 Spalten zu erhalten.Laravel Eloquent erhalten Daten von mehreren verwandten Tabelle

das ist mein delivery_forecasts Tisch

Schema::create('delivery_forecasts', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->enum('type',array('Quotation','Demo','Service Unit','Freebie','Back Job','Site Visit')); 
     $table->string('type_id'); 
     $table->date('transaction_date'); 
     $table->time('transaction_time')->nullable(); 
     $table->enum('status',array('Pending','Approved','Cancelled'))->default('Pending'); 
     $table->boolean('queue')->default(0); 
     $table->timestamps(); 
    }); 

die Frage ist, kann ich das eloquent in Modell zu erstellen? oder wie man Bedingung macht?

zum Beispiel:

class DeliveryForecast extends Model 
{ 
    public function documents(){ 
     if(DeliveryForecast->type == 'Quotation'){ 
      return $this->belongsTo('App\Quotation','type_id','id'); 
     } 
     if(DeliveryForecast->type == 'Demo'){ 
      return $this->belongsTo('App\Demo','type_id','id'); 
     } 
     if(DeliveryForecast->type == 'Service Unit'){ 
      return $this->belongsTo('App\ServiceUnit','type_id','id'); 
     } 
     and so on ..... 
    } 
} 

Ich habe keine Ahnung, um den Zustand zu eloquent und meine Abfrage sollte so sein zu erstellen:

$delivery_forecast = DeliveryForecast::with('documents') 
     ->get(); 

keine Idee Jungs? Danke im Voraus.

+1

Werfen Sie einen Blick auf die "polymorphen" Abschnitt der Eloquent-Dokumentation – Scopey

+0

in Ihrem Szenario müssen Sie mehrere Funktionen im 'DeliveryForecast' Modell für jede einzelne Beziehung erstellen. –

Antwort

2

Wie @Scopey sagte, einen Blick auf polymorphe Beziehungen nehmen: https://laravel.com/docs/5.2/eloquent-relationships#polymorphic-relations

Um nach Ihrer Migration Sie polymorphe Beziehung zu implementieren ändern:

Schema::create('delivery_forecasts', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->morphs('type'); 
     $table->date('transaction_date'); 
     $table->time('transaction_time')->nullable(); 
     $table->enum('status', ['Pending', 'Approved', 'Cancelled'])->default('Pending'); 
     $table->boolean('queue')->default(0); 
     $table->timestamps(); 
    }); 

und dann DeliveryForecast ‚Methode s ändern zu:

public function document() 
{ 
    return $this->morphTo('type'); 
} 

Und das ist alles. Aber ich würde vorschlagen, stark Beziehung hinzuzufügen, in Ihren Quotation, Demo und anderen Modellen:

public function deliveryForecasts() 
{ 
    return $this->morphMany('App\DeliveryForecast', 'type'); 
} 

Wenn $forecast->document Laravel Abfrage automatisch richtiges Modell holt für ohne andere Bedingungsklauseln.

+0

danke @Scopey und @Giedrius Kiršys, das funktioniert perfekt wie ich erwartet habe. Letzte Sache, gibt es eine Möglichkeit, dass ich eine weitere Beziehung in polymorph eloquent hinzufügen kann? so etwas wie dieses ... 'return $ this-> morphMany ('App \ DeliveryForecast', 'Typ') -> mit ('Kunde');' weil alle verknüpften Tabellen in deliveryForecast wie (‘ Quotation ',' Demo ',' Service Unit 'hat eine eigene Spalte customer_id. – frightnight

Verwandte Themen