Actions
11 months ago
DataTransferObjects
11 months ago
Endpoints
10 months ago
Factories
11 months ago
LegacyListeners
3 years ago
ListTable
1 year ago
Migrations
1 year ago
Models
10 months ago
Repositories
11 months ago
ValueObjects
11 months ago
ViewModels
10 months ago
resources
10 months ago
ServiceProvider.php
11 months ago
SubscriptionQuery.php
11 months ago
SubscriptionsAdminPage.php
11 months ago
SubscriptionQuery.php
188 lines
| 1 | <?php |
| 2 | |
| 3 | namespace Give\Subscriptions; |
| 4 | |
| 5 | use Give\Donations\ValueObjects\DonationMetaKeys; |
| 6 | use Give\Donors\ValueObjects\DonorMetaKeys; |
| 7 | use Give\Framework\Models\ModelQueryBuilder; |
| 8 | use Give\Framework\QueryBuilder\JoinQueryBuilder; |
| 9 | use Give\Subscriptions\Models\Subscription; |
| 10 | |
| 11 | /** |
| 12 | * @since 4.8.0 |
| 13 | */ |
| 14 | class SubscriptionQuery |
| 15 | { |
| 16 | /** |
| 17 | * @var ModelQueryBuilder<Subscription> |
| 18 | */ |
| 19 | protected $query; |
| 20 | |
| 21 | /** |
| 22 | * @since 4.8.0 |
| 23 | */ |
| 24 | public function __construct() |
| 25 | { |
| 26 | $this->query = Subscription::query(); |
| 27 | } |
| 28 | |
| 29 | /** |
| 30 | * Clone the query with all current conditions applied |
| 31 | * |
| 32 | * @since 4.8.0 |
| 33 | */ |
| 34 | public function clone(): self |
| 35 | { |
| 36 | $cloned = new self(); |
| 37 | |
| 38 | // Copy the internal query state by cloning the ModelQueryBuilder |
| 39 | $cloned->query = clone $this->query; |
| 40 | |
| 41 | return $cloned; |
| 42 | } |
| 43 | |
| 44 | /** |
| 45 | * Delegates methods not defined locally to the underlying query. |
| 46 | * |
| 47 | * @since 4.8.0 |
| 48 | * |
| 49 | * @return mixed |
| 50 | */ |
| 51 | public function __call(string $method, array $args) |
| 52 | { |
| 53 | if (method_exists($this, $method)) { |
| 54 | return $this->$method(...$args); |
| 55 | } |
| 56 | |
| 57 | return $this->query->$method(...$args); |
| 58 | } |
| 59 | |
| 60 | /** |
| 61 | * @since 4.8.0 |
| 62 | */ |
| 63 | public function selectDonorNames(): self |
| 64 | { |
| 65 | $this->query->attachMeta( |
| 66 | 'give_donormeta', |
| 67 | 'customer_id', |
| 68 | 'donor_id', |
| 69 | [DonorMetaKeys::FIRST_NAME, 'firstName'], |
| 70 | [DonorMetaKeys::LAST_NAME, 'lastName'] |
| 71 | ); |
| 72 | |
| 73 | return $this; |
| 74 | } |
| 75 | |
| 76 | /** |
| 77 | * @since 4.8.0 |
| 78 | */ |
| 79 | public function whereCampaignId(int $campaignId): self |
| 80 | { |
| 81 | $this->query->join(function (JoinQueryBuilder $builder) use ($campaignId) { |
| 82 | $builder->innerJoin('give_donationmeta', 'donationMetaCampaignId') |
| 83 | ->on('donationMetaCampaignId.meta_key', DonationMetaKeys::CAMPAIGN_ID, true) |
| 84 | ->andOn('donationMetaCampaignId.meta_value', $campaignId, true) |
| 85 | ->andOn('donationMetaCampaignId.donation_id', 'parent_payment_id'); |
| 86 | }); |
| 87 | |
| 88 | return $this; |
| 89 | } |
| 90 | |
| 91 | /** |
| 92 | * @since 4.8.0 |
| 93 | */ |
| 94 | public function excludeAnonymousDonors(): self |
| 95 | { |
| 96 | $this->query->join(function (JoinQueryBuilder $builder) { |
| 97 | $builder->innerJoin('give_donationmeta', 'donationMetaAnonymous') |
| 98 | ->on('donationMetaAnonymous.meta_key', DonationMetaKeys::ANONYMOUS, true) |
| 99 | ->andOn('donationMetaAnonymous.meta_value', '0') |
| 100 | ->andOn('donationMetaAnonymous.donation_id', 'parent_payment_id'); |
| 101 | }); |
| 102 | |
| 103 | return $this; |
| 104 | } |
| 105 | |
| 106 | /** |
| 107 | * @since 4.8.0 |
| 108 | */ |
| 109 | public function whereDonorId(int $donorId): self |
| 110 | { |
| 111 | $this->query->where('customer_id', $donorId); |
| 112 | |
| 113 | return $this; |
| 114 | } |
| 115 | |
| 116 | /** |
| 117 | * @since 4.8.0 |
| 118 | */ |
| 119 | public function whereMode(string $mode): self |
| 120 | { |
| 121 | $this->query->where('payment_mode', $mode); |
| 122 | |
| 123 | return $this; |
| 124 | } |
| 125 | |
| 126 | /** |
| 127 | * @since 4.8.0 |
| 128 | * |
| 129 | * @param $status string|array |
| 130 | */ |
| 131 | public function whereStatus($status): self |
| 132 | { |
| 133 | if (is_array($status)) { |
| 134 | $this->query->whereIn('status', $status); |
| 135 | } else { |
| 136 | $this->query->where('status', $status); |
| 137 | } |
| 138 | |
| 139 | return $this; |
| 140 | } |
| 141 | |
| 142 | /** |
| 143 | * @since 4.8.0 |
| 144 | */ |
| 145 | public function limit(int $limit): self |
| 146 | { |
| 147 | $this->query->limit($limit); |
| 148 | |
| 149 | return $this; |
| 150 | } |
| 151 | |
| 152 | /** |
| 153 | * @since 4.8.0 |
| 154 | */ |
| 155 | public function offset(int $offset): self |
| 156 | { |
| 157 | $this->query->offset($offset); |
| 158 | |
| 159 | return $this; |
| 160 | } |
| 161 | |
| 162 | /** |
| 163 | * @since 4.8.0 |
| 164 | */ |
| 165 | public function orderBy(string $column, string $direction = 'ASC'): self |
| 166 | { |
| 167 | $this->query->orderBy($column, $direction); |
| 168 | |
| 169 | return $this; |
| 170 | } |
| 171 | |
| 172 | /** |
| 173 | * @since 4.8.0 |
| 174 | */ |
| 175 | public function getAll(): array |
| 176 | { |
| 177 | return $this->query->getAll() ?? []; |
| 178 | } |
| 179 | |
| 180 | /** |
| 181 | * @since 4.8.0 |
| 182 | */ |
| 183 | public function count(): int |
| 184 | { |
| 185 | return $this->query->count(); |
| 186 | } |
| 187 | } |
| 188 |