【发布时间】:2015-02-15 11:22:54
【问题描述】:
我正在尝试在 laravel 中保存多态关系,但无法使其正常工作。我要么得到这个错误:Call to undefined method Illuminate\Database\Query\Builder::save() 如果我这样做 $user->provider()->save($provider)
或者我得到
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))
如果我切换它并按照Call to undefined Builder::save() when saving a polymorphic relationship 中的建议执行$provider->user()->save($provider);
从我能找到的关于多态关系的小文档中,似乎 userable_type/id 的东西放在父表中,并且由于 User 是我的父表,而不是 Provider,第二种方法似乎是错误的方法它。
我猜我会说问题出在我的 morphTo/morphOne 方法上,但我不知道如何修复它们,因为这些方法的文档对它们的参数没有任何说明。我的 provider 表的设置可能与 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 上找到的其他答案让我很困惑,因为它们都不是英文的。您可以将其发布为答案,我会将其标记为已接受