【问题标题】:Polymorphic relation - morphTo save() not recognizing custom primary key多态关系 - morphTo save() 无法识别自定义主键
【发布时间】:2017-04-04 14:09:39
【问题描述】:

用户模型:

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

导师模型:

public function user()
{
    return $this->morphOne('App\Models\User', 'userable');
}

学生模型看起来与导师模型相同。

Student 和 Mentors 表包含一个名为 user_id 的自定义 PK,它引用 users 表上的主键。

所以我想做的是以下几点:

    $user = new User();
    $user->first_name = 'Trajce';
    $user->last_name = 'Petkoski';
    $user->nickname = 'ads';
    $user->administrator = '0';
    $user->email = 'asd';
    $user->password = Hash::make('test');
    $user->save();

    $mentor = new Mentor();
    $mentor->user_id = $user->id;
    $mentor->save();

    $user->userable_id = $mentor->user_id;
    $mentor->user()->save($user);

但是,在用户表中,userable_id 设置为 0,而 userable_type 值设置为正确值。这里的问题是 save() 将其设置为预定义的 0。知道幕后发生了什么吗?

【问题讨论】:

  • 你使用的是什么版本的 Laravel?
  • 最新的,5.4

标签: php laravel laravel-5 eloquent laravel-eloquent


【解决方案1】:

试试这个将数据添加到多态关系(morphOne):

迁移

// User
Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('first_name');
    $table->string('last_name');
    $table->string('nickname');
    $table->integer('administrator');
    $table->string('email');
    // add these two for the relation to work
    $table->integer('userable_id')->unsigned();
    $table->string('userable_type');
    //
    $table->rememberToken();
    $table->timestamps();
});

// Mentor
Schema::create('mentors', function (Blueprint $table) {
    $table->increments('id');
    $table->timestamps();
});

用户模型

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

导师模型

public function user()
{
   return $this->morphOne('App\Models\User', 'userable');
}

关联代码:

$mentor = new Mentor();
// this is important: first save mentor
$mentor->save();

$userdata = [
    'first_name' => 'Trajce',
    'last_name' => 'Petkoski',
    'nickname' => 'ads',
    'administrator' => 0,
    'email' => 'asd',
    'password' => Hash::make('test')
 ];

$mentor->user()->create($userdata);

这在我的 Laravel 5.4 测试安装中就像一个魅力

【讨论】:

  • $table->increments('id');导师表的 PK 应该是用户的 PK,如果 PK 是 Id,它就像一个魅力。
  • 这不是多态关系的工作方式。你有没有尝试过?请发布答案我很想知道解决方案。
  • 抱歉我的回复晚了。这是 Laravel 核心代码中的一个错误,已得到修复。
【解决方案2】:

试试这个

public function users() {
  return $this->morphMany('App\Models\User', 'userable');
}

【讨论】:

  • 这是一对一的关系
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
相关资源
最近更新 更多