Schránka a potvrdenia o prečítaní
Messages::inboxFor() vráti stránkovanie vlákien účastníka — od najnovšej aktivity — s prednačítanou poslednou správou (aj jej odosielateľom), účastníkmi a počtom unread_count pre každé vlákno, takže bočný panel chatu sa vykreslí bez N+1 dopytov:
use RoundlyConsulting\Messages\Facades\Messages;
$inbox = Messages::inboxFor($bob, perPage: 20);
foreach ($inbox as $thread) {
$thread->unread_count; // integer
$thread->latestMessagePreview(); // short, type-aware preview string
}Každé vlákno nesie denormalizovaný ukazovateľ last_message_id, takže načítanie poslednej správy je jedno indexované vyhľadanie na stránku namiesto prechodu všetkými správami všetkých vlákien — schránka zostáva rýchla aj pri raste vlákien. Ukazovateľ sa aktualizuje automaticky pri každom odoslaní, úprave, zrušení odoslania, obnovení aj prune; nikdy ho neudržiavate sami.
Podkladový scope je verejný, takže doň môžete pridať vlastné podmienky:
use RoundlyConsulting\Messages\Models\Thread;
// The same query as a scope — add your own constraints on top
Thread::query()->inboxFor($bob)->whereNull('archived_at')->paginate(20);Pomocníci vlákna a správy
$thread->markReadFor($bob); // same as Messages::markRead($thread, $bob)
$thread->latestMessagePreview(); // null when the thread is empty
$message->isReadBy($bob); // has $bob read up to this message?Potvrdenia o prečítaní a počty neprečítaných
$thread->unreadCountFor($user); // messages $user hasn't read (excludes their own)
$thread->seenBy($message); // participants whose read pointer is at/after $message
$participant->hasUnread();
$participant->markAsRead(); // same as Messages::markRead() for that participantStav prečítania sa riadi ukazovateľom prečítania každého účastníka, last_read_message_id — správou, po ktorú sa dostal, keď vlákno naposledy označil ako prečítané. Správa je neprečítaná, ak je zoradená za touto správou (podľa created_at, potom podľa kľúča) alebo účastník ešte nič nečítal, a zároveň nie je jej odosielateľom; systémové správy bez odosielateľa sa rátajú pre všetkých. read_at zaznamenáva len to, kedy čítal, takže odpoveď, ktorá príde v tej istej sekunde ako prečítanie, sa stále ráta ako neprečítaná. Ak sa správa ukazovateľa neskôr zmaže cez prune, zastúpi ju read_at.
Správy v zmazanom vlákne sa nerátajú nikdy — globálne unreadCount() sa zhoduje so schránkou.
Označenie vlákna ako prečítaného
Messages::markRead($thread, $bob); // facade
Messages::thread($thread)->markRead($bob); // thread handle
$bob->markThreadRead($thread); // HasMessaging
$thread->markReadFor($bob); // thread helper
$participant->markAsRead(); // participant row
// all go through the manager: MarkRead runs, ThreadRead fires, the fake records itOznačenie presunie ukazovateľ na najnovšiu správu vlákna a do read_at zapíše aktuálny čas. Všetky uvedené cesty sú tá istá operácia — vrátane Participant::markAsRead() — takže sa spustí ThreadRead a Messages::fake() ju zaznamená; markAsRead() vyhodí ParticipationException::participantMissing(), ak jeho model už neexistuje. Označenie pre model, ktorý vo vlákne nie je, vyhodí ParticipationException::notAParticipant().
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.