|
71 | 71 | 'name', |
72 | 72 | 'department', |
73 | 73 | 'salary', |
74 | | - 'total_orders' => Db::raw('(SELECT COUNT(*) FROM orders WHERE user_id = users.id)'), |
75 | | - 'total_amount' => Db::raw('(SELECT COALESCE(SUM(amount), 0) FROM orders WHERE user_id = users.id)') |
| 74 | + 'total_orders' => function ($q) { |
| 75 | + $q->from('orders') |
| 76 | + ->select([Db::count()]) |
| 77 | + ->where('user_id', Db::raw('users.id')); |
| 78 | + }, |
| 79 | + 'total_amount' => function ($q) { |
| 80 | + $q->from('orders') |
| 81 | + ->select([Db::coalesce(Db::sum('amount'), 0)]) |
| 82 | + ->where('user_id', Db::raw('users.id')); |
| 83 | + } |
76 | 84 | ]) |
77 | 85 | ->get(); |
78 | 86 |
|
|
86 | 94 | echo "2. Subquery in WHERE...\n"; |
87 | 95 | $results = $db->find() |
88 | 96 | ->from('users') |
89 | | - ->where('salary', Db::raw('(SELECT AVG(salary) FROM users)'), '>') |
| 97 | + ->where('salary', function ($q) { |
| 98 | + $q->from('users')->select([Db::avg('salary')]); |
| 99 | + }, '>') |
90 | 100 | ->select(['name', 'salary']) |
91 | 101 | ->get(); |
92 | 102 |
|
|
113 | 123 | echo "4. EXISTS subquery...\n"; |
114 | 124 | $results = $db->find() |
115 | 125 | ->from('users') |
116 | | - ->where(Db::raw('EXISTS (SELECT 1 FROM orders WHERE orders.user_id = users.id)')) |
| 126 | + ->whereExists(function ($q) { |
| 127 | + $q->from('orders')->where('orders.user_id', Db::raw('users.id')); |
| 128 | + }) |
117 | 129 | ->select(['name', 'department']) |
118 | 130 | ->get(); |
119 | 131 |
|
|
127 | 139 | echo "5. NOT EXISTS subquery...\n"; |
128 | 140 | $results = $db->find() |
129 | 141 | ->from('users') |
130 | | - ->where(Db::raw('NOT EXISTS (SELECT 1 FROM orders WHERE orders.user_id = users.id)')) |
| 142 | + ->whereNotExists(function ($q) { |
| 143 | + $q->from('orders')->where('orders.user_id', Db::raw('users.id')); |
| 144 | + }) |
131 | 145 | ->select(['name', 'department']) |
132 | 146 | ->get(); |
133 | 147 |
|
|
139 | 153 |
|
140 | 154 | // Example 6: IN subquery |
141 | 155 | echo "6. IN subquery...\n"; |
142 | | -$driver = getCurrentDriver($db); |
143 | | -$quote = $driver === 'pgsql' ? "'" : '"'; |
144 | 156 | $results = $db->find() |
145 | 157 | ->from('users') |
146 | | - ->where('id', Db::raw("(SELECT DISTINCT user_id FROM orders WHERE status = {$quote}completed{$quote})"), 'IN') |
| 158 | + ->whereIn('id', function ($q) { |
| 159 | + $q->from('orders') |
| 160 | + ->select(['user_id']) |
| 161 | + ->where('status', 'completed') |
| 162 | + ->groupBy('user_id'); |
| 163 | + }) |
147 | 164 | ->select(['name', 'department']) |
148 | 165 | ->get(); |
149 | 166 |
|
|
161 | 178 | 'name', |
162 | 179 | 'department', |
163 | 180 | 'salary', |
164 | | - 'dept_avg_salary' => Db::raw('(SELECT AVG(salary) FROM users u2 WHERE u2.department = users.department)'), |
| 181 | + 'dept_avg_salary' => function ($q) { |
| 182 | + $q->from('users u2') |
| 183 | + ->select([Db::avg('salary')]) |
| 184 | + ->where('u2.department', Db::raw('users.department')); |
| 185 | + }, |
165 | 186 | 'salary_vs_dept' => Db::raw('(salary - (SELECT AVG(salary) FROM users u2 WHERE u2.department = users.department))') |
166 | 187 | ]) |
167 | 188 | ->get(); |
|
196 | 217 | 'name', |
197 | 218 | 'department', |
198 | 219 | 'salary', |
199 | | - 'salary_rank' => Db::raw('(SELECT COUNT(*) + 1 FROM users u2 WHERE u2.salary > users.salary)'), |
200 | | - 'dept_rank' => Db::raw('(SELECT COUNT(*) + 1 FROM users u2 WHERE u2.department = users.department AND u2.salary > users.salary)'), |
201 | | - 'total_users' => Db::raw('(SELECT COUNT(*) FROM users)'), |
202 | | - 'dept_users' => Db::raw('(SELECT COUNT(*) FROM users u2 WHERE u2.department = users.department)') |
| 220 | + 'salary_rank' => function ($q) { |
| 221 | + $q->from('users u2')->select([Db::raw('COUNT(*) + 1')])->where('u2.salary', Db::raw('users.salary'), '>'); |
| 222 | + }, |
| 223 | + 'dept_rank' => function ($q) { |
| 224 | + $q->from('users u2') |
| 225 | + ->select([Db::raw('COUNT(*) + 1')]) |
| 226 | + ->where('u2.department', Db::raw('users.department')) |
| 227 | + ->andWhere('u2.salary', Db::raw('users.salary'), '>'); |
| 228 | + }, |
| 229 | + 'total_users' => function ($q) { |
| 230 | + $q->from('users')->select([Db::count()]); |
| 231 | + }, |
| 232 | + 'dept_users' => function ($q) { |
| 233 | + $q->from('users u2')->select([Db::count()])->where('u2.department', Db::raw('users.department')); |
| 234 | + } |
203 | 235 | ]) |
204 | 236 | ->orderBy('salary', 'DESC') |
205 | 237 | ->get(); |
|
239 | 271 | WHEN SUM(amount) > 1000 THEN \'Good Performer\' |
240 | 272 | ELSE \'Average Performer\' |
241 | 273 | END FROM orders WHERE orders.user_id = users.id)'), |
242 | | - 'order_count' => Db::raw('(SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id)'), |
243 | | - 'total_revenue' => Db::raw('(SELECT COALESCE(SUM(amount), 0) FROM orders WHERE orders.user_id = users.id)') |
| 274 | + 'order_count' => function ($q) { |
| 275 | + $q->from('orders')->select([Db::count()])->where('orders.user_id', Db::raw('users.id')); |
| 276 | + }, |
| 277 | + 'total_revenue' => function ($q) { |
| 278 | + $q->from('orders')->select([Db::coalesce(Db::sum('amount'), 0)])->where('orders.user_id', Db::raw('users.id')); |
| 279 | + } |
244 | 280 | ]) |
245 | 281 | ->get(); |
246 | 282 |
|
|
0 commit comments