Modely a trait vlastníka
Purchase, PurchaseItem, Subscription, SubscriptionItem, PurchaseRefund a PurchaseNotification (v RoundlyConsulting\Purchases\Models) sú štandardné Eloquent modely so soft delete a factory.
Nákupy jedného vlastníka
Purchases::for($owner) nepotrebuje na modeli žiadny trait — obmedzí dopyty presne na morph typ a kľúč daného vlastníka:
use RoundlyConsulting\Purchases\Facades\Purchases;
Purchases::for($user)->subscribedTo('pro'); // bool
Purchases::for($user)->activeSubscription('pro'); // ?Subscription (latest active)
Purchases::for($user)->purchases()->latest()->get(); // Builder<Purchase>
Purchases::for($user)->subscriptions()->count(); // Builder<Subscription>Trait HasPurchases
Pridajte trait do modelu vlastníka — zvyčajne User — a získate vzťahy purchases a subscriptions cez polymorfný vzťah owner. Jeho pomocníky activeSubscription() a subscribedTo() sú len skratkou pre Purchases::for($this), takže sa správajú presne ako fasáda:
use RoundlyConsulting\Purchases\Concerns\HasPurchases;
class User extends Authenticatable
{
use HasPurchases;
}
$user->purchases; // MorphMany<Purchase>
$user->subscriptions; // MorphMany<Subscription>
$user->activeSubscription(); // ?Subscription — the latest active one
$user->activeSubscription('pro'); // ?Subscription — by plan name
$user->subscribedTo('pro'); // bool — both delegate to Purchases::for($this)Scopy a pomocníky predplatného
use RoundlyConsulting\Purchases\Models\Subscription;
Subscription::active()->expiring(7)->get(); // active and ending within 7 days
Subscription::trialing()->get();
Subscription::canceled()->get();
$subscription->isActive(); // entitled and not past ends_at
$subscription->onTrial();
$subscription->daysUntilRenewal(); // ?int
$subscription->isExpiring(7);
$subscription->items; // HasMany<SubscriptionItem>- active() — stav Completed alebo InGracePeriod a ends_at prázdne alebo v budúcnosti.
- trialing() — trial_ends_at v budúcnosti.
- expiring($days = 7) — ends_at v priebehu najbližších $days dní.
- canceled() — stav Canceled.
- daysUntilRenewal() — celé dni do ends_at (nikdy záporné), alebo null bez dátumu konca.
Scopy poskytovateľa a vzťahy
Purchase, Subscription a PurchaseRefund zdieľajú forProvider(), byProviderId() a byTransaction(); PurchaseRefund pridáva chargebacks() a PurchaseNotification pridáva pending():
use RoundlyConsulting\Purchases\Models\Purchase;
use RoundlyConsulting\Purchases\Models\PurchaseNotification;
use RoundlyConsulting\Purchases\Models\PurchaseRefund;
Purchase::forProvider('stripe')->byProviderId('pi_123')->first();
Purchase::byTransaction('2000000000000001')->first();
PurchaseRefund::forProvider('google')->chargebacks()->get();
PurchaseNotification::forProvider('apple')->pending()->get();
$purchase->owner; // MorphTo — your User (or null)
$purchase->items; // HasMany<PurchaseItem>
$purchase->refunds; // HasMany<PurchaseRefund>
$purchase->meta; // Collection — the raw store payload
$refund->purchase; // BelongsTo<Purchase>Výmena modelov
Každý model sa dá vymeniť cez config('purchases.models.*'). Vaša trieda musí byť modelom balíka, ktorý nahrádza, alebo z neho dediť — akákoľvek iná trieda vyhodí InvalidConfigurationException s názvom kľúča namiesto toho, aby sa potichu použil model balíka:
// app/Models/Purchase.php
namespace App\Models;
use RoundlyConsulting\Purchases\Models\Purchase as BasePurchase;
class Purchase extends BasePurchase
{
// your relations, accessors, casts …
}
// config/purchases.php
'models' => [
'purchase' => \App\Models\Purchase::class,
// …
],Schéma
| Tabuľka | Stĺpce |
|---|---|
purchases | owner (voliteľný morph), provider, provider_id, transaction_id, status, price + price_currency, meta, last_event_at — unikátne (provider, provider_id) |
purchase_items | purchase_id (kaskádové mazanie), provider_id, name, price + price_currency, quantity |
subscriptions | owner (voliteľný morph), provider, provider_id, transaction_id, name, status, price + price_currency, active_from, trial_ends_at, ends_at, meta, last_event_at — unikátne (provider, provider_id) |
subscription_items | subscription_id (kaskádové mazanie), provider_id, name, price + price_currency |
purchase_refunds | purchase_id (voliteľné), provider, provider_id, transaction_id, reason, chargeback, price + price_currency, refunded_at, meta, last_event_at — unikátne (provider, provider_id) |
purchase_notifications | provider, type, signature_verified, payload, processed_at |
Každá tabuľka má timestamps a soft deletes. Názvy tabuliek pochádzajú z getTable() každého modelu, takže vymenený model s vlastným $table sa zmigruje pod týmto názvom — nastavte ho pred spustením migrácií.
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.