Primárne kontakty a poradie
Každý vlastník má vždy najviac jeden primárny kontakt pre každý druh. Pri zapnutom auto_primary (predvolene) si druh, ktorý má kontakty, primárny aj udrží: stane sa ním prvý pridaný, a keď primárny kontakt zmažete, odstránite synchronizáciou alebo presuniete do iného druhu, povýši sa ďalší podľa poradia. Označenie iného kontaktu ako primárneho zosadí predchádzajúci v rámci databázovej transakcie:
$first = $user->addEmail('[email protected]'); // first email: primary automatically
$second = $user->addEmail('[email protected]', primary: true);
$first->fresh()->is_primary; // false — demoted in the same transaction
$second->fresh()->is_primary; // true
$phone = $user->addPhone('+421900000000'); // each kind keeps its own primary
$phone->is_primary; // true
Contacts::setPrimary($first); // promote again; fires PrimaryContactChanged
Contacts::delete($first); // the primary leaves its kind...
$second->fresh()->is_primary; // true — ...and the next by position takes over- Primárne kontakty sa určujú podľa vlastníka a surového druhu — email, phone aj každý registrovaný vlastný druh má svoj.
- Kontakty bez vlastníka zdieľajú medzi sebou jeden primárny kontakt na druh.
- PrimaryContactChanged sa spustí po potvrdení transakcie povýšenia, s novým primárnym kontaktom a so zosadeným (alebo null) — aj pri automatickom povýšení.
- Príznak sa zapíše dotazom nad uloženým riadkom, takže povýšený kontakt nespustí udalosti modelu Eloquent saving ani updated — počúvajte PrimaryContactChanged — a neuložené zmeny na kontakte odovzdanom do setPrimary() sa neuložia.
- Pri vypnutom auto_primary sa za vás nič nepovyšuje.
- Obnovený primárny kontakt sa vráti ako sekundárny, ak medzitým jeho druh povýšil iný kontakt.
- Soft-zmazaný kontakt nedrží miesto primárneho: jeho povýšenie vyhodí PrimaryContactConflict.
- Pri zapnutom require_owner_for_primary vyhodí povýšenie kontaktu bez vlastníka PrimaryContactConflict a druhy bez vlastníka sa automaticky nepovyšujú.
Súbežné povýšenia
Dve súbežné povýšenia v rámci jedného vlastníka a druhu nikdy nevyhrajú obe. Každé povýšenie — setPrimary() aj každé pridanie, úprava, zmazanie a synchronizácia, ktoré povyšujú — beží v jednej transakcii, ktorá prečíta kontakt tak, ako je uložený, uzamkne skupinu jeho druhu a až potom zosadí druhý primárny kontakt. Na PostgreSQL a SQLite navyše index jedného primárneho kontaktu (pozrite Databázová schéma) odmietne primárny kontakt, ktorý zámok nezachytil, a povýšenie sa raz zopakuje voči potvrdenému víťazovi; na MySQL povýšenia zoraďuje samotný zámok.
Poradie
Každý kontakt má v rámci svojho druhu pozíciu. Nové kontakty dostanú ďalšie voľné miesto (od 0), pokiaľ ho ContactData nenastaví explicitne; sync() priraďuje pozície podľa poradia vstupu:
$user->addPhone('+421900000001'); // position 0
$user->addPhone('+421900000002'); // position 1 — next free slot within the kind
// Pin a position explicitly
$user->addContact(new ContactData(ContactType::Phone, '+421900000003', position: 0));
$user->contactsOfType(ContactType::Phone); // ordered by position, then id
Contact::query()->forOwner($user)->ordered()->get();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.