2015-06-09 3 views
2

Согласно Dayle Reesвнешний ключ не признается в Laravel 4,2

All foreign key columns follow a similar naming convention. The singular form of the related model appended with _id.

Рассмотрим эту миграцию:

class CreateTables extends Migration { 
// ... 
    public function up() 
    { 
    Schema::create('artists', function($table) { 
     $table->increments('id'); 
     $table->string('name',64); 
     $table->timestamps(); 
    }); 
    Schema::create('albums', function($table) { 
     $table->increments('id'); 
     $table->string('name',64); 
     $table->integer('artist_id')->unsigned(); 
     $table->foreign('artist_id')->references('id')->on('artists'); 
     $table->timestamps(); 
    }); 
} 

Вот мои красноречивые модели:

<?php 
// Artist model 
class Artist extends Eloquent { 
    public function albums() { 
     return $this->hasMany('Album'); 
    } 
} 

<?php 
// Album model 
class Album extends Eloquent { 
    public function artists() { 
     return $this->belongsTo('Artist'); 
    } 
} 

Я использовал их, как это:

Route::get('/', function() { 
    $artist = new Artist; 
    $artist->name = "Morbid Angel"; 
    $artist->save(); 
    $album = new Album; 
    $album->name = "Altars of Madness"; 
    $album->artists()->associate($artist); 
    $album->save(); 
    return View::make('hello'); 
}); 

Это не похоже на работу, согласно журналам:

[2015-06-09 06:01:12] production.ERROR: exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'artists_id' in 'field list''

Но я не создавал artists_id. Что это значит? Не должен ли laravel найти artist_id, потому что он должен быть сингулярным следующим by _id?

+0

Как вы определяете свои отношения. Я думаю, это один для многих – chanafdo

ответ

2

Это ваша проблема. Вы назвали свое отношение artists, но оно должно быть artist. Вот почему он искал колонку с именем artists_id.

Вы должны определить, как ваши отношения следуют так, как мне кажется, это одно для многих.

В вашей Artists модели

public function albums() 
{ 
    return $this->hasMany('Album'); 
} 

В вашей Albums модели

public function artist() 
{ 
    return $this->belongsTo('Artist'); 
} 

Тогда попробуйте свой код.

Route::get('/', function() { 
    $artist = new Artist; 
    $artist->name = "Morbid Angel"; 
    $artist->save(); 

    $album = new Album; 
    $album->name = "Altars of Madness"; 

    $artist->albums()->save($album); 

    return View::make('hello'); 
}); 
+0

Я вижу, ваши модели в порядке. Вы попытались увидеть изменение, внесенное мной в часть ввода кода, в мой ответ. Попробуйте и дайте мне знать. – chanafdo

+0

Я использовал ваш код ввода, и он работает. Почему это? И я использовал имя исполнителя в функции, потому что книга использует множественное число для функций albumfunctions. Они сказали, что не имеет значения, какое имя вы дали функции модели. – morbidCode

+0

Я думаю, это имеет значение, потому что я думаю, что это имя используется для получения ключевого имени отношения. Ошибка забрасывалась, потому что она искала «artist_id» вместо «artist_id». И еще, если вы вызываете 'associate', вам нужно сначала сохранить свой объект. Если мой ответ помог вам, вы могли бы пометить его как ответ. Печально, что omeone снизил мой ответ. :( – chanafdo

0

В модели художника попробовать return $this->hasMany('Album', 'artist_id');

+1

Конечно, вы можете переопределить его, но, согласно книге, по умолчанию является artist_id, поэтому мы не должны переопределять его. – morbidCode

+1

Ну, что там работает. –

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