2015-01-15 2 views
1

У меня есть 2 таблицы с довольно сложными отношениями. Таблица users имеет два внешних ключа к таблице images, а таблица images имеет один внешний ключ для таблицы users, который не имеет отношения к другим двум внешним ключам.Невозможно получить работу Модели Laravel со многими отношениями

Я не могу правильно подобрать модели. Мне нужно, чтобы все ссылочные поля были связаны с моделями, а также так, что в User есть свойство images, которое возвращает все изображения, принадлежащие этому пользователю.
Вот мой стол код генерирующий:

Schema::create('users', function ($table) { 
    $table->increments('id')->unsigned(); 

    $table->integer('portrait')->unsigned()->nullable(); 
    $table->integer('backimg')->unsigned()->nullable(); 

    $table->timestamps(); 
}); 
Schema::create('images', function ($table) { 
    $table->increments('id')->unsigned(); 

    $table->integer('owner')->unsigned(); 
    $table->foreign('owner')->references('id')->on('users'); 

    $table->timestamps(); 
}); 
Schema::table('users', function($table) { 
    $table->foreign('portrait')->references('id')->on('images'); 
    $table->foreign('backimg')->references('id')->on('images'); 
}); 

И вот моя попытка с моделями:

class User extends Eloquent implements UserInterface, RemindableInterface { 
    public function backimg(){ 
     return $this->hasOne('Image', 'backimg'); 
    } 
    public function portrait(){ 
     return $this->hasOne('Image', 'portrait'); 
    } 
    public function images(){ 
     return $this->belongsTo('Image', 'owner'); 
    } 
} 
class Image extends Eloquent { 
    public function owner(){ 
     return $this->hasOne('User', 'owner'); 
    } 
} 

Я думал, что приведенный выше код должен работать, однако все свойства возвращают строки не объекты.

+1

Сторона примечания: '-> nullable() -> default (null)' избыточно, вам не нужно использовать по умолчанию. –

+0

@TimLewis Я знаю, я написал его так, чтобы потом было легко перейти на что-то другое. – Somnium

ответ

2

Вы не можете назвать отношения такими же, как имена столбцов внешнего ключа!

Изменение одного должно работать, однако я предлагаю вам изменить столбцы внешнего ключа на owner_id, portrait_id и т. Д. Тогда вам также не нужно указывать столбец внешнего ключа в ваших отношениях, поскольку вы используете обычное имена.

+0

Это не имена иностранных ключей - это имена столбцов. Laravel автоматически называет внешние ключи, добавляя имя таблицы раньше. – Somnium

+0

Извините, я на самом деле имел в виду имя ваших столбцов внешнего ключа. – lukasgeiter

+0

Во всяком случае, я не понимаю, как поможет переименование поля с 'portrait' на' portrait_id'. Можете ли вы привести пример, пожалуйста? – Somnium

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