【问题标题】:Laravel 4: Save polymorphic relationshipLaravel 4:保存多态关系
【发布时间】: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-&gt;user()-&gt;save($user);这是我每天使用的方式,它的工作没有任何问题。
  • 那行得通。我在 SO 上找到的其他答案让我很困惑,因为它们都不是英文的。您可以将其发布为答案,我会将其标记为已接受

标签: php laravel-4


【解决方案1】:

你可以这样称呼它:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2015-03-05
    • 2013-08-12
    相关资源
    最近更新 更多