2014-12-17 13 views
1

Я пытаюсь сохранить полиморфные отношения в laravel и не могу заставить его работать. Я либо получаю эту ошибку: Call to undefined method Illuminate\Database\Query\Builder::save() если я $user->provider()->save($provider)Laravel 4: Сохранить полиморфные отношения

Или я

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'userable_type' in 'field list' (SQL: insert into 'providers' ('user_id', 'userable_type', 'userable_id') values (16, Provider, 16))

, если я включаю его вокруг и делать $provider->user()->save($provider); как предложено в Call to undefined Builder::save() when saving a polymorphic relationship

Из того, что мало документации я мог бы найти по полиморфным отношениям, кажется, что файл userable_type/id находится в родительской таблице, а поскольку User является моей родительской таблицей, а не провайдером, второй метод, кажется, неправильный способ сделать это.

Предположим, что проблема связана с моими методами morphTo/morphOne, но я не знаю, как их исправить, поскольку документация для этих методов не имеет ничего общего с их параметрами. Таблица моего провайдера может быть настроена немного иначе, чем ожидаемый laravel, поскольку в качестве первичного ключа не имеет инкрементного поля id; первичный ключ - это внешний ключ и называется user_id.

Это мой регистр код:

public function postRegister() 
{ 
    $input = Input::all(); 
    $user = $this->user; 
    $validator = Validator::make($input, $user::$rules); 

    if($validator->passes()) 
    { 
     $user->username = $input['username']; 
     $user->email = $input['email']; 
     $user->password = Hash::make($input['password']); 
     $user->save(); 

     if($input['account_type'] == 0) 
     { 
      $provider = new Provider(); 
      $provider->user_id = $user->id; 

      //$provider->user()->save($provider); 
      $user->provider()->save($provider); 
     } 

     return 'Success'; 
    } 
    else 
    { 
     return Redirect::back()->withInput($input)->withErrors($validator->messages()); 
    } 
} 

модель Пользователь:

<?php 

class User extends Validatable implements UserInterface, RemindableInterface 
{ 
    use UserTrait, RemindableTrait; 

    protected $table = 'users'; 

    public function userable() 
    { 
     return $this->morphTo(); 
    } 
} 

Поставщик Модель:

<?php 

class Provider extends Validatable 
{ 
    protected $table = 'providers'; 
    protected $primaryKey = 'user_id'; 

    public $timestamps = false; 

    public function user() 
    { 
     return $this->morphOne('User', 'userable'); 
    } 
} 
+0

Вы должны называть его: '$ provider-> user() -> save ($ user)'; это то, как я использую ежедневно, он работает без проблем. –

+0

Хорошо, что сработало. Другой ответ (ы), который я нашел на SO, смутил меня, потому что ни один из них не был на английском. Вы можете опубликовать это в качестве ответа, я помечаю его как принятый – Telanor

ответ

2

Вы можете назвать это так:

$provider->user()->save($user); 
Смежные вопросы