2016-10-04 12 views
0

我有两个型号如下第三标识,雄辩belongsToMany与透视列作为同步

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]); 
} 

没有工作。

任何解决方案?

+0

这个答案可能会帮助你http://stackoverflow.com/a/ 27230803/3551175 – Skysplit

+0

我试过了,在我的情况下,我必须保存具有不同透视值的相同param_id和user_id的两个条目。 – sudhirk496

回答

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'] 
    ]); 
} 
+0

我已经在使用detach()和attach()做它,想知道是否有办法用sync()来做到这一点。无论如何,我检查了同步实现,我不能重写sync()方法。不管怎么说,还是要谢谢你。 – sudhirk496