Eloquent属于ToMany,其中pivot列为同步的第三个标识符

时间:2016-10-04 05:11:53

标签: php laravel eloquent many-to-many

我有两个模型如下,

User {
    public function param()
    {
        return $this->belongsToMany(
            Models\Param::class, 'param_user_map', 'user_id', 'param_id')
                ->withPivot('experience', 'param_extra');
    }
}

Params {
    public function user()
    {
        return $this->belongsToMany(
            Models\User::class, 'param_user_map', 'param_id', 'user_id')
                ->withPivot('experience', 'param_extra');
    }
}

我的映射表,

param_user_map
  -param_id
  -user_id
  -experience
  -param_extra

我正在处理的数据就像,

user_id  param_id  experience  param_extra
51       2         3           param2_1
51       2         3           param2_2
51       3         3           param3_2

当我使用Eloquent同步此数据时,只保存前两个中的一个。

有什么方法可以将数据与[param_id,user_id,param_extra]同步为唯一组合。

我试过了,

$table->unique(['param_id','user_id','param_extra']);

foreach ($data['param_collection'] as $param) {
    $params = [
        'experience' => $params['experience'],
        'param_extra' => $params['param_extra'],
    ];
    $user->param()->sync([$param['param_id'] => $params]);
}

没有工作。

任何解决方案?

1 个答案:

答案 0 :(得分:0)

我认为你不能用sync做你想做的事。如果您想做的不仅仅是创建没有额外属性的唯一“用户” - “参数”对,您可以使用attach

foreach ($data['param_collection'] as $param) {
    $user->param()->detach(); //if you want to clear previous params

    $user->param()->attach($param['param_id'], [
        'experience' => $param['experience'],
        'param_extra' => $param['param_extra']
    ]);
}