2015-12-20 4 views
1

я создаю новое веб-приложение, где у меня есть 3 таблицы: users, teams и project:Laravel подправлять при вставке в БД

Вот структура team и project миграции:

Schema::create('teams', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('team_image', 15); 
    $table->string('team_name', 50); 
    $table->string('team_description'); 
    $table->timestamps(); 
}); 

Schema::create('project', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('members')->unsigned(); 
    $table->foreign('members')->references('id')->on('teams'); 
    $table->string('name'); 
    $table->string('description'); 
    $table->string('lead'); 
    $table->timestamps(); 
}); 

Вот в Team и Project модели:

class Team extends Model 
{ 
    protected $table = 'teams'; 

    public function projects() 
    { 
     return $this->hasMany('App\Project'); 
    } 
} 

class Project extends Model 
{ 
    protected $table = 'project'; 
    protected $fillable = ['name', 'description']; 

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

В ремесленник я запускаю это:

$team = factory('App\Team')->create(); 

И я получил заселена к Д.Б. обманщик и фетиш это нормально. Но когда я пытаюсь вызвать проект:

$team->projects()->create(['name'=>'project 1', 'description'=>'bla bla']); 

Я получаю это:

Осветите \ Database \ QueryException с сообщением «SQLSTATE [42S22]: Колонка не найден: 1054 Неизвестный столбец 'team_id' в 'списке полей' (SQL: вставки в project (name, description, team_id, updated_at, created_at) значения (проект 1, бла-бла, 2, 2015-12-20 00:06:29, 2015-12- 20 00:06:29)) '

И team_id использовали вместо members, используется в нескольких миграций ранее, но я сброшена миграции и обновил файл переноса и повторно миграций и дб отлично, members колонка создается.

Когда я заменяю members на team_id, тогда вояжник работает и вставляет его в таблицу project.

Любые подсказки?

ответ

1

Код отношения не знает информации на уровне базы данных, такой как ограничения внешнего ключа. Это связано с тем, что миграция используется только для создания таблиц, у них нет связи с фактическими моделями.

Вместо этого стандартное соглашение об именах используется отношениями для внешних ключей. Он состоит из нижнего имени соответствующей модели (в вашем случае team), к которой добавлена ​​строка _id. Таким образом, он заканчивается team_id, поэтому он работает, когда столб называется так. Если вы хотите, чтобы ключевой столбец чужд иметь не стандартное имя (например, members) вы должны указать, что при определении отношения:

class Team extends Model 
{ 
    protected $table = 'teams'; 

    public function projects() 
    { 
     return $this->hasMany('App\Project', 'members'); 
    } 
} 

Laravel Документация по one-to-many relationships объясняет, что при необходимости вы можете пройти еще два параметра на метод hasMany, внешний ключ и имена столбцов локального ключа.

+0

Спасибо Богдану, мне нужно больше читать, так что это очень помогло мне и решило проблему. Тпх – pinarella

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