2013-05-05 20 views
6

Attualmente sto riscontrando problemi con una relazione: n con Laravel 4, sto avendo un errore con la tabella pivot che sta interrogando su una tabella con entrambi i componenti al singolare nome. Creo un perno lands_objs tabella e popolarla:Laravel 4 rapporto molti a molti non funzionante, tabella pivot non trovata

I modelli sono:

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

Ecco come Io popolo della tabella pivot seguendo gli standard. Naturalmente terre, OBJS e lands_objs tabelle esistono:

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

Con questa struttura dovrei essere in grado di fare grazie ad eloquente:

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

ma prendo l'errore:

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,)) 

Laravel non dovrebbe creare il tavolo lands_objs nonostante quering su land_obj? Mi sto perdendo qualcosa?

Grazie mille.

risposta

13

La tabella pivot dovrebbe essere la versione singolare dei nomi delle tabelle si collegano, in ordine alfabetico così nel tuo caso:

land_obj piuttosto che lands_objs

Se davvero non si vuole utilizzare il default convenzioni di denominazione è anche possibile specificare il nome della tabella come il 2 ° param sulla chiamata belongsToMany nei tuoi modelli:

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

e

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

Per ulteriori informazioni vedere docs here

+0

Puoi dirmi qual è la differenza tra l'utilizzo di 2 ** ** belongsTo metodi e il metodo ** ** hasManyThrough? Non capisco, ma usare hasManyTrough non funziona per me ... – kitensei

+0

Dato lo scenario un autore ha molti messaggi e un post ha molti commenti. Avresti 2 appartiene ai metodi in genere (autore di postare e postare commenti), tuttavia dici di voler selezionare tutti i commenti su tutti i post per un determinato autore, quindi useresti hasManyThrough perché i commenti non sono direttamente correlati all'Autore ma sono legati all'Autore tramite un altro modello (post). Senza hasManyThrough dovresti selezionare tutti i post dell'autore, quindi eseguirli in loop ottenendo tutti i commenti, quindi eseguire una sorta di elaborazione per ottenere il formato, l'ordine, ecc. Che cercavi. – Brent

Problemi correlati