2016-10-04 18 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