PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Donors / DonorsQuery.php
give / src / Donors Last commit date
Actions 7 months ago CustomFields 1 year ago DataTransferObjects 1 year ago Endpoints 5 months ago Exceptions 2 years ago Factories 1 year ago ListTable 7 months ago Migrations 1 year ago Models 1 year ago Repositories 8 months ago ValueObjects 9 months ago resources 5 months ago DonorStatisticsQuery.php 9 months ago DonorsAdminPage.php 5 months ago DonorsQuery.php 5 months ago ServiceProvider.php 5 months ago
DonorsQuery.php
156 lines
1 <?php
2
3 namespace Give\Donors;
4
5 use Give\Donations\ValueObjects\DonationMetaKeys;
6 use Give\Donors\Models\Donor;
7 use Give\Framework\Models\ModelQueryBuilder;
8 use Give\Framework\QueryBuilder\JoinQueryBuilder;
9 use Give\Framework\QueryBuilder\QueryBuilder;
10
11 /**
12 * @since 4.4.0
13 */
14 class DonorsQuery
15 {
16 /**
17 * @var ModelQueryBuilder<Donor>
18 */
19 protected $query;
20
21 /**
22 * @since 4.4.0
23 */
24 public function __construct()
25 {
26 $this->query = Donor::query();
27 }
28
29 /**
30 * Delegates methods not defined locally to the underlying query.
31 *
32 * @since 4.4.0
33 *
34 * @return mixed
35 */
36 public function __call(string $method, array $args)
37 {
38 if (method_exists($this, $method)) {
39 return $this->$method(...$args);
40 }
41
42 return $this->query->$method(...$args);
43 }
44
45 /**
46 * @since 4.8.0 Fix subqueries to not return duplicate donors
47 * @since 4.4.0
48 */
49 public function whereDonorsHaveDonations(
50 string $mode = '',
51 int $campaignId = 0,
52 bool $excludeAnonymousDonors = true
53 ): self {
54 if (empty($mode)) {
55 $mode = give_is_test_mode() ? 'test' : 'live';
56 }
57
58 $this->query->whereExists(function (QueryBuilder $builder) use ($mode, $campaignId, $excludeAnonymousDonors) {
59 $builder
60 ->select('1')
61 ->from('give_donationmeta', 'dm1')
62 ->join(function (JoinQueryBuilder $joinBuilder) use ($mode) {
63 $joinBuilder
64 ->innerJoin('give_donationmeta', 'dm2')
65 ->on('dm2.donation_id', 'dm1.donation_id')
66 ->andOn('dm2.meta_key', DonationMetaKeys::MODE, true)
67 ->andOn('dm2.meta_value', $mode, true);
68 })
69 ->join(function (JoinQueryBuilder $joinBuilder) {
70 $joinBuilder
71 ->innerJoin('posts', 'p')
72 ->on('p.ID', 'dm1.donation_id')
73 ->andOn('p.post_type', 'give_payment', true);
74 })
75 ->whereIn('p.post_status', ['publish', 'give_subscription'])
76 ->where('dm1.meta_key', DonationMetaKeys::DONOR_ID)
77 ->whereRaw(sprintf('AND dm1.meta_value = %s', $this->query->prefixTable('give_donors.id')));
78
79 if ($campaignId) {
80 $builder->join(function (JoinQueryBuilder $joinBuilder) use ($campaignId) {
81 $joinBuilder
82 ->innerJoin('give_donationmeta', 'dm3')
83 ->on('dm3.donation_id', 'dm1.donation_id')
84 ->andOn('dm3.meta_key', DonationMetaKeys::CAMPAIGN_ID, true)
85 ->andOn('dm3.meta_value', $campaignId, true);
86 });
87 }
88
89 if ($excludeAnonymousDonors) {
90 $builder->join(function (JoinQueryBuilder $joinBuilder) {
91 $joinBuilder
92 ->innerJoin('give_donationmeta', 'dm4')
93 ->on('dm4.donation_id', 'dm1.donation_id')
94 ->andOn('dm4.meta_key', DonationMetaKeys::ANONYMOUS, true)
95 ->andOn('dm4.meta_value', '0', true);
96 });
97 }
98 });
99
100 return $this;
101 }
102
103 /**
104 * @since 4.4.0
105 */
106 public function limit(int $limit): self
107 {
108 $this->query->limit($limit);
109
110 return $this;
111 }
112
113 /**
114 * @since 4.4.0
115 */
116 public function offset(int $offset): self
117 {
118 $this->query->offset($offset);
119
120 return $this;
121 }
122
123 /**
124 * @since 4.4.0
125 */
126 public function orderBy(string $column, string $direction = 'ASC'): self
127 {
128 $this->query->orderBy($column, $direction);
129
130 return $this;
131 }
132
133 /**
134 * @since 4.4.0
135 */
136 public function getAll(): array
137 {
138 return $this->query->getAll() ?? [];
139 }
140
141 /**
142 * Clone the query builder.
143 *
144 * @since 4.14.0
145 *
146 * @return self
147 */
148 public function clone(): self
149 {
150 $cloned = new self();
151 $cloned->query = clone $this->query;
152
153 return $cloned;
154 }
155 }
156