2013-05-05 5 views
6

У меня в настоящее время возникают проблемы с: n отношениями с Laravel 4, у меня ошибка с таблицей поворота, которая запрашивает таблицу с обоими компонентами по единственному имени. Я создать сводную таблицу lands_objs и заполнить ее:Laravel 4 для многих отношений не работает, сводная таблица не найдена

Модели:

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

Вот как я заполнить сводную таблицу следующие стандарты. Конечно земли, Objs и lands_objs таблицы существуют:

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

С этой структурой, я должен быть в состоянии сделать благодаря красноречив:

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

Но я беру ошибку:

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 не должен создавать таблицу lands_objs, несмотря на запрос на land_obj? Я что-то упускаю?

Большое спасибо.

ответ

13

Сводная таблица должна быть особой версией таблицы имен она ссылающаяся, в алфавитном порядке, поэтому в вашем случае:

land_obj вместо lands_objs

Если вы действительно не хотите использовать по умолчанию именования можно также указать имя таблицы в качестве 2-го по парам вызова belongsToMany в вашей модели:

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

и

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

Для получения дополнительной информации см docs here

+0

Можете ли вы сказать мне, что разница между использованием 2 ** belongsTo ** методы и ** hasManyThrough ** метод? Я не понимаю, но использование hasManyTrough не работает для меня ... – kitensei

+0

Учитывая сценарий, у автора много сообщений, а Post имеет много комментариев. У вас было бы 2, как правило, для методов (автор публикует и публикует комментарии), однако, скажите, что вы хотите выбрать все комментарии ко всем сообщениям для данного автора, тогда вы будете использовать hasManyThrough, потому что комментарии не являются напрямую связанные с Автором, но они связаны с Автором через другую модель (сообщение). Без hasManyThrough вам нужно будет выбрать все записи автора, затем зацикливать их на получение всех комментариев, затем выполнить какую-то обработку, чтобы получить их в формате/заказе и т. Д. – Brent

 Смежные вопросы

  • Нет связанных вопросов^_^