2017-05-20 192 views
0

我一直在爲我的Laravel應用程序構建定製門票系統,用戶可以在其門票上放置註釋。從集合中刪除集合

當發表新評論時,我想向通知門票中涉及的每個人發送通知。

用戶可以參與,如果他們是:

  • 票證擁有者
  • 分配給機票代理
  • 邀請作爲參與者的車票

要做到這一點,我正在創建一組用戶,然後通過它們循環來通知他們。唯一的問題是,它目前還包括髮表評論的人,並且他們不需要被通知,因爲他們是離開評論的人。

我試圖集合如果ID匹配當前登錄的用戶刪除用戶,但這似乎並沒有工作:

$ticket = App\Ticket::findOrFail(1); 

//Create collection to hold users to be notified 
$toBeNotified = collect(); 

//Add the ticket owner 
$toBeNotified->push($ticket->owner); 

//If an agent is assigned to the ticket, add them 
if(!is_null($ticket->assigned_to)) $toBeNotified->push($ticket->agent); 

//Add any active participants that have been invited 
$ticket->activeParticipants()->each(function($participant) use ($toBeNotified) { 
    $toBeNotified->push($participant->user); 
}); 

//Remove any duplicate users that appear 
$toBeNotified = $toBeNotified->unique(); 

//Remove the logged in user from the collection 
$toBeNotified->filter(function($user) { 
    return $user->id != Auth::user()->id; 
}); 

//...loop through each user and notify them 

在進一步閱讀,我覺得這是因爲您使用filter從集合中刪除元素,而不是集合中的集合。

如果用戶是當前登錄的用戶,如何從集合中刪除用戶?

當我dd($toBeNotified)運行上面後,這是結果:

enter image description here

回答

1

您可以使用except來實現這一目標。

$toBeNotified = $toBeNotified->except(auth()->id()); 

作爲一個方面說明,當你想添加多個用戶,你應該使用合併。

$toBeNotified = $toBeNotified->merge($ticket->activeParticipants); 

您使用的過濾器方法也是正確的,但它會在保持原始集合不變的情況下返回已過濾的集合。

$toBeNotified = $toBeNotified->filter(function($user) { 
    return $user->id != auth()->id(); 
}); 

編輯:當你有一個雄辯的收集將except只工作。

+0

'except()'不起作用,因爲它排除了基於集合中的鍵的項目,並且鍵與用戶的ID無關。如果你首先通過'keyBy()'鍵入集合的用戶id,它會起作用。 – patricus

+0

@patricus我在這個項目中只用了一週'except' https://github.com/gothinkster/laravel-realworld-example-app/blob/master/database/seeds/DummyDataSeeder.php#L111和i肯定知道它的工作原理。我甚至還爲你自己寫了一個測試。不知道你是否做了這個評論,甚至不費心去測試。檢查我更新的答案。 – Sandeesh

+0

@Sandeesh爲此感謝。我實現了'merge()'來清理代碼,並使用'filter()',但正如你所指出的,我正在改變'$ toBeNotified'來實際設置返回的內容。謝謝您的幫助! – James