2013-05-05 9 views
6

Mam obecnie problemy z relacją: n z Laravel 4, mam błąd z tabelą przestawną, która wyszukuje na stole przy użyciu obu składników w liczbie pojedynczej. Tworzę przestawnych lands_objs tabeli i wypełnić go:Laravel 4 wiele do wielu relacji nie działa, tabela przestawna nie została znaleziona

modele to:

<?php 
    class Obj extends Eloquent 
    { 
     protected $guarded = array(); 
     public static $rules = array(); 
     public $timestamps = false; 
     public function land() 
     { 
      return $this->belongsToMany('Land'); 
    } 

<?php 

    class Land extends Eloquent 
    { 
     protected $guarded = array(); 
     public static $rules = array(); 
     public $timestamps = false; 

     public function objs() 
     { 
      return $this->belongsToMany('Obj'); 
     } 
    } 

Oto jak wypełnić tabelę przestawną następujące normy. Oczywiście Grunty, OBJS i lands_objs istnieją tabele:

<?php 

use Illuminate\Database\Migrations\Migration; 

class CreateLandsObjsTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('lands_objs', function($table) { 
      $table->integer('land_id'); 
      $table->integer('obj_id'); 
     }); 
    } 
} 

Dzięki tej konstrukcji powinny być w stanie zrobić dzięki wymowny:

$land = Land::find(1); //checked loads land fine 
$objs = $land->objs; //--> HERE I TAKE THE ERROR 

Ale biorę błąd:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'taylor.land_obj' doesn't exist 
(SQL: select `objs`.*, `land_obj`.`land_id` as `pivot_land_id`, `land_obj`.`obj_id` 
as `pivot_obj_id` from `objs` inner join `land_obj` on `objs`.`id` = `land_obj`.`obj_id` 
where `land_obj`.`land_id` = ?) (Bindings: array (0 => 1,)) 

Czy Laravel nie powinien tworzyć tabeli lands_objs pomimo zapytania na land_obj? Czy czegoś brakuje?

Wielkie dzięki.

Odpowiedz

13

Stół obrotowy powinien być pojedyncza wersja nazw tabel jest spinające, w porządku alfabetycznym, więc w Twoim przypadku:

land_obj zamiast lands_objs

Jeśli naprawdę nie chcesz używać domyślnego konwencje nazewnictwa można również określić nazwę tabeli jako 2nd param na wezwanie belongsToMany w modelach:

return $this->belongsToMany('Obj', 'lands_objs'); 

i

return $this->belongsToMany('Land', 'lands_objs'); 

Więcej informacji można znaleźć docs here

+0

Czy możesz mi powiedzieć, jaka jest różnica między używaniem 2 ** belongsTo ** sposoby i metody ** hasManyThrough **? Nie rozumiem, ale używanie hasManyTrough nie działa dla mnie ... – kitensei

+0

Biorąc pod uwagę scenariusz, autor ma wiele postów, a post ma wiele komentarzy. Miałbyś 2 należy do metod typowych (autor, aby opublikować i opublikować komentarz), ale powiedz, że chcesz zaznaczyć wszystkie komentarze do wszystkich postów dla danego autora, wtedy użyłbyś hasManyThrough, ponieważ komentarze nie są bezpośrednio związane z Autorem, ale są związane z Autorem za pośrednictwem innego modelu (post). Bez maManyThrough musisz wybrać wszystkie posty autora, a następnie zapętlić je wszystkie komentarze, a następnie wykonaj jakieś przetwarzanie, aby uzyskać je w formacie/kolejności itp., Które były po. – Brent

Powiązane problemy