2017-02-23 108 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

感谢它的工作。 –