2017-02-23 59 views
0

插入新記錄我與我創建了3代表的laravel 5.4而是在數據透視表更新數據,它laravel

工作:
門票
ticket_cc_users
用戶

ticket_cc_users作爲數據透視表工作。

在下面的代碼中,我想更新我的數據透視表。但是,當我運行更新查詢時,它會將數據插入到我的數據庫中而不是更新它。

$ticket = Ticket::find($id); 
$ticket->requester_id = $this->user['id']; 
$ticket->type = $request->type; 
$ticket->priority = $request->priority; 
$ticket->subject = $request->subject; 
$ticket->description = $request->description; 
$ticket->status = $request->status;  
if($ticket->save()) 
{ 
    for($i=0;$i<count($request->cc_id);$i++) 
    { 
     $ticket->users()->attach($request->cc_id[$i]['id'],['ticket_id'=>$ticket->id]); 
    }   
} 

票務型號:

public function users() 
{ 
    return $this->belongsToMany('App\User','ticket_cc_users'); 
} 

用戶模式:

public function tickets() 
{ 
    return $this->belongsToMany('App\Models\Tickets\Ticket','ticket_cc_users'); 
} 

什麼,我應該爲了做我的代碼做我想做什麼?

+0

你能在你的票務和用戶模型中顯示關係嗎? – TheFallen

回答

1

attach()方法將在您的數據透視表中創建一條新記錄。要更新現有的記錄:

$ticket->users()->updateExistingPivot($userID, $arrayOfColumnsYouWantToUpdate); 

我不知道什麼侑$request->cc_id手段,但在我的例子,如果你可以設置$userID到要更新的用戶的ID和方法的一個參數updateExistingPivot()是數據透視表中您要更新的列的數組。

編輯

如果要更新相關門票的用戶更換你的for循環與這一個:

$userIDs = []; 

for($i=0;$i<count($request->cc_id);$i++) 
{ 
    $userIDs[] = $request->cc_id[$i]['id']; 
} 

$ticket->users()->sync($userIDs); 

sync()方法將刪除這些都是用戶不再在你的門票,並會自動添加新的。

+0

我已經嘗試了你說的,但它不工作。我寫了'$ ticket-> users() - > updateExistingPivot($ request-> cc_id [$ i] ['id'],['user_id']);'這裏user_id是一個列名。 '$ request-> cc_id'是一個user_id的數組。 –

+0

第二個參數需要像這樣'['key'=>'value']',對我來說,這看起來像是要更新與此故障單相關的所有用戶,因此請檢查我編輯的答案。 – TheFallen

+0

感謝它的工作。 –