src/Traits/Messageable.php
<?php namespace Musonza\Chat\Traits; use Illuminate\Database\Eloquent\Relations\MorphMany;use Musonza\Chat\Exceptions\InvalidDirectMessageNumberOfParticipants;use Musonza\Chat\Models\Conversation;use Musonza\Chat\Models\Participation; trait Messageable{ public function conversations() { return $this->participation->pluck('conversation'); } /** * @return MorphMany */ public function participation(): MorphMany { return $this->morphMany(Participation::class, 'messageable'); } public function joinConversation(Conversation $conversation) { if ($conversation->isDirectMessage() && $conversation->participants()->count() == 2) { throw new InvalidDirectMessageNumberOfParticipants(); } $participation = new Participation([ 'messageable_id' => $this->getKey(), 'messageable_type' => $this->getMorphClass(), 'conversation_id' => $conversation->getKey(), ]); $this->participation()->save($participation); } public function leaveConversation($conversationId) { $this->participation()->where([ 'messageable_id' => $this->getKey(), 'messageable_type' => $this->getMorphClass(), 'conversation_id' => $conversationId, ])->delete(); }}