Я пытаюсь сохранить полиморфные отношения в 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');
}
}
Вы должны называть его: '$ provider-> user() -> save ($ user)'; это то, как я использую ежедневно, он работает без проблем. –
Хорошо, что сработало. Другой ответ (ы), который я нашел на SO, смутил меня, потому что ни один из них не был на английском. Вы можете опубликовать это в качестве ответа, я помечаю его как принятый – Telanor