2015-07-10 9 views
19

W laravel 5,1 widzę, że relacje kolumn tabeli może być set-up na 2 sposoby:migracji zagranicznych Najważniejsze Vs wymowny Relacje w laravel

1) Definiowanie kluczy obcych w tabeli migracji.

2) Definiowanie wymownych relacji w modelach.

Czytałem dokumentacje i jestem nadal mylone na:

  1. Czy trzeba używać obu lub 1 jest potrzebne tylko?

  2. Czy korzystanie z obu tych funkcji jest niewłaściwe w tym samym czasie? Czy może to nadmiarowe lub powodować konflikty?

  3. Jaka jest korzyść z używania Wymownych relacji bez wspominania o kluczach obcych w kolumnie migracji?

  4. Jaka jest różnica?

Oto kody, które mam teraz. Nadal niejasne dla mnie, jeśli muszę usunąć obcych kluczy, które ustawiłem w moim pliku migracji.

Migracja:

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'); 
     });  
    } 

Model z wymownym Relationships:

// 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'); 
    } 
} 

Czy ktoś może mi pomóc zrozumieć to proszę?

Odpowiedz

18

Zarówno idą ręka w rękę. Jeden jest kompletny bez drugiego. Jeśli chcesz doskonale pracować nad swoimi relacjami, musisz zdefiniować obie rzeczy.

Jeśli właśnie zdefiniowałeś klucz obcy w twoim pliku migracyjnym, relacja zadziałałaby, ale na wszelki wypadek, gdybyś napisał surowe zapytanie. To nie zadziała na twoich modelach; ponieważ nie napisałeś nic o relacjach w twoich modelach.

Tak więc, gdy tylko napiszesz hasMany w jednym z twoich modeli i odpowiadającą funkcję w innym modelu, tylko wtedy twój model o tym wie, a następnie z powodzeniem przeszukuje rzeczy przez twój model, jak również w twojej bazie danych.

Należy również pamiętać, że jeśli prawidłowo zdefiniowane relacje poprzez hasMany i belongsTo w swoich modelach, ale nie dostarczyły klucza obcego w tabeli modelu, który belongsTo drugi stół, twoje stosunki nie będzie działać.

Krótko mówiąc, oba są jednakowo obowiązkowe.

+0

doskonały. Właśnie o to mi chodziło i dziękuję za potwierdzenie tego dla mnie. Spoglądając na powyższe kody Migracji i Modelu, czy poprawnie dokonałem powiązania powiązań i ograniczeń klucza obcego? To jest moja pierwsza próba i zastanawiam się, czy jestem na dobrej drodze. Jeszcze raz dziękuję @ArslanAli – Neel

+0

@Neel Aby przejrzeć swój kod, możesz opublikować swój kod na stronie http://codereview.stackexchange.com/ i uzyskać przyzwoitą (mam nadzieję) opinię na jego temat. Dzięki. –

+0

Przepraszam, nie jestem pewien, czy rozumiem to zdanie w prawo: 'ale nie podałem klucza obcego w tabeli model, który należy do innej tabeli, twoje relacje nie zadziałają. – Neel

2

Eonquent przyjmuje klucz obcy relacji na podstawie nazwy modelu.W tym przypadku model App zakłada automatycznie mieć app_id klucz obcy, tak w swoich migracjach nie trzeba określić:

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

Documentation