2015-07-10 2 views
19

In Laravel 5.1 kann ich, dass die Tabellenspalte Beziehungen sehen kann auf 2 Arten eingerichtet werden:Migration Fremdschlüssel Vs Eloquent Beziehungen in Laravel

1) Definition von Fremdschlüsseln in der Migrationstabelle.

2) Definieren der beredten Beziehungen in den Modellen.

Ich habe die Dokumentationen gelesen und ich bin immer noch auf der folgenden verwirrt:

  1. Muss ich beide verwenden müssen oder nur 1 benötigt?

  2. Ist es falsch beide gleichzeitig zu verwenden? Oder macht es überflüssig oder verursacht Konflikte?

  3. Welchen Vorteil bietet die Verwendung von Eloquent-Beziehungen, ohne die Fremdschlüssel in der Migrationsspalte zu erwähnen?

  4. Was ist der Unterschied?

Dies sind die Codes, die ich jetzt habe. Es ist mir immer noch unklar, ob ich die Fremdschlüssel entfernen muss, die ich in meiner Migrationsdatei eingerichtet habe.

Migration:

public function up() 
    { 

     Schema::create('apps', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->string('app_name'); 
      $table->string('app_alias'); 
      $table->timestamps(); 
      $table->engine = 'InnoDB'; 
     }); 

     // This is the second Migration table 
     Schema::create('app_roles', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->integer('app_id')->unsigned()->index(); 
      $table->integer('user_id')->unsigned()->index(); 
      $table->integer('role_id')->unsigned()->index(); 
      $table->engine = 'InnoDB'; 

      $table->unique(array('app_id', 'user_id')); 

      $table->foreign('app_id') 
       ->references('id') 
       ->on('apps') 
       ->onDelete('cascade'); 

      $table->foreign('user_id') 
       ->references('id') 
       ->on('users') 
       ->onDelete('cascade'); 

      $table->foreign('role_id') 
       ->references('id') 
       ->on('roles') 
       ->onDelete('cascade'); 
     });  
    } 

Modell mit Eloquent Beziehungen:

// App Model 
class App extends Model 
{ 

    public function appRoles() { 
     return $this->hasMany('App\Models\AppRole'); 
    } 
} 

// AppRole Model 
class AppRole extends Model 
{ 
    public function app() { 
     return $this->belongsTo('App\Models\App'); 
    } 

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

    public function role() { 
     return $this->belongsTo('App\Models\Role'); 
    } 
} 

// User Model 
class User extends Model implements AuthenticatableContract, CanResetPasswordContract 
{ 
    ..... 
    public function appRole() { 
     return $this->belongsToMany('App\Models\AppRole'); 
    } 
} 

// Role Model 
class Role extends EntrustRole 
{ 
    public function appRole() { 
     return $this->hasMany('App\Models\AppRole'); 
    } 
} 

Kann mir jemand helfen, dies zu verstehen, bitte?

Antwort

18

Beide gehen Hand in Hand. Eins ist vollständig ohne das andere. Wenn Sie Ihre Beziehungen perfekt arbeiten wollen, müssen Sie beide Dinge definieren.

Wenn Sie gerade den Fremdschlüssel in Ihrer Migrationsdatei definiert haben, würde die Beziehung funktionieren, aber nur für den Fall, dass Sie eine unbearbeitete Abfrage schreiben. Es wird nicht mit deinen Modellen funktionieren; Seitdem hast du nichts über Beziehungen in deinen Modellen geschrieben.

Also, sobald Sie hasMany in einem Ihrer Modelle und entsprechende Funktion in anderen Modell schreiben, nur dann kennt Ihr Modell darüber, und dann fragen Sie erfolgreich Dinge durch Ihr Modell sowie in Ihrer Datenbank.

Beachten Sie auch, dass, wenn Sie richtig Beziehungen durch hasMany und belongsTo in Ihren Modellen definiert haben, aber noch nicht Fremdschlüssel in der Tabelle des Modells zur Verfügung gestellt, die belongsTo anderer Tisch, Ihre Beziehungen nicht funktionieren.

Kurz gesagt, beide sind gleichermaßen obligatorisch.

+0

perfekt. Darüber war ich verwirrt und danke Ihnen, dass Sie das für mich bestätigt haben. Sehen Sie sich kurz meine oben genannten Migrations- und Modellcodes an, habe ich die Verknüpfung von Beziehungen und Fremdschlüsseleinschränkungen korrekt durchgeführt? Dies ist mein erster Versuch und ich frage mich nur, ob ich damit auf dem richtigen Weg bin. Nochmals vielen Dank @ArslanAli – Neel

+0

@Neel Für die Überprüfung Ihres Codes können Sie Ihren Code bei http://codereview.stackexchange.com/, und kann eine anständige (ich hoffe) Bewertung darüber. Vielen Dank. –

+0

Sorry, ich bin mir nicht sicher, ob ich diesen Satz richtig verstehe: 'aber habe keinen Fremdschlüssel in der Tabelle das Modell angegeben, der zu anderen Tabellen gehört, Ihre Beziehungen werden nicht funktionieren. – Neel

2

Eloquent nimmt den Fremdschlüssel der Beziehung basierend auf dem Modellnamen an.In diesem Fall wird das App Modell automatisch angenommen, eine app_id Fremdschlüssel haben, also in Ihrem Migrationen Sie müssen nicht angeben:

$table->foreign('app_id') 
->references('id') 
->on('apps') 
->onDelete('cascade'); 

Documentation