Repository navigation
Expand file tree
/
Copy pathBuilder.php
More file actions
245 lines (228 loc) · 14.7 KB
/
Copy pathBuilder.php
File metadata and controls
245 lines (228 loc) · 14.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact [email protected]
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace Hyperf\Types\Builder;
use Hyperf\Database\Model\Builder;
use Hyperf\Database\Model\Model;
use Hyperf\Database\Model\Relations\BelongsTo;
use Hyperf\Database\Model\Relations\HasMany;
use Hyperf\Database\Model\Relations\MorphTo;
use function PHPStan\Testing\assertType;
/** @param Builder<User> $query */
function test(
Builder $query,
User $user,
Post $post,
ChildPost $childPost,
Comment $comment
): void {
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->where('id', 1));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->orWhere('name', 'John'));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->with('relation'));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->with(['relation' => ['foo' => fn ($q) => $q]]));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->with(['relation' => function ($query) {
// assertType('Hyperf\Database\Model\Relations\Relation<*,*,*>', $query);
}]));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->without('relation'));
assertType('array<int, Hyperf\Types\Builder\User>', $query->getModels());
assertType('array<int, Hyperf\Types\Builder\User>', $query->eagerLoadRelations([]));
assertType('Hyperf\Database\Model\Collection<int, Hyperf\Types\Builder\User>', $query->get());
assertType('Hyperf\Database\Model\Collection<int, Hyperf\Types\Builder\User>', $query->hydrate([]));
assertType('Hyperf\Database\Model\Collection<int, Hyperf\Types\Builder\User>', $query->fromQuery('foo', []));
assertType('Hyperf\Database\Model\Collection<int, Hyperf\Types\Builder\User>', $query->findMany([1, 2, 3]));
assertType('Hyperf\Database\Model\Collection<int, Hyperf\Types\Builder\User>', $query->findOrFail([1]));
assertType('Hyperf\Database\Model\Collection<int, Hyperf\Types\Builder\User>', $query->findOrNew([1]));
assertType('Hyperf\Database\Model\Collection<int, Hyperf\Types\Builder\User>', $query->find([1]));
assertType('Hyperf\Database\Model\Collection<int, Hyperf\Types\Builder\User>', $query->findOr([1], callback: fn () => 42));
assertType('Hyperf\Types\Builder\User', $query->findOrFail(1));
assertType('Hyperf\Types\Builder\User|null', $query->find(1));
assertType('Hyperf\Types\Builder\User|int', $query->findOr(1, fn () => 42));
assertType('Hyperf\Types\Builder\User|int', $query->findOr(1, callback: fn () => 42));
assertType('Hyperf\Types\Builder\User|null', $query->first());
assertType('Hyperf\Types\Builder\User|int', $query->firstOr(fn () => 42));
assertType('Hyperf\Types\Builder\User|int', $query->firstOr(callback: fn () => 42));
assertType('Hyperf\Types\Builder\User', $query->firstOrNew(['id' => 1]));
assertType('Hyperf\Types\Builder\User', $query->findOrNew(1));
assertType('Hyperf\Types\Builder\User', $query->firstOrCreate(['id' => 1]));
assertType('Hyperf\Types\Builder\User', $query->createOrFirst(['id' => 1]));
assertType('Hyperf\Types\Builder\User', $query->create(['name' => 'John']));
assertType('Hyperf\Types\Builder\User', $query->forceCreate(['name' => 'John']));
assertType('Hyperf\Types\Builder\User', $query->getModel());
assertType('Hyperf\Types\Builder\User', $query->make(['name' => 'John']));
assertType('Hyperf\Types\Builder\User', $query->forceCreate(['name' => 'John']));
assertType('Hyperf\Types\Builder\User', $query->updateOrCreate(['id' => 1], ['name' => 'John']));
assertType('Hyperf\Types\Builder\User', $query->firstOrFail());
assertType('Hyperf\Types\Builder\User', $query->sole());
assertType('Generator<int, Hyperf\Types\Builder\User, Hyperf\Types\Builder\User, void>', $query->cursor());
assertType('Hyperf\Collection\LazyCollection<int, Hyperf\Types\Builder\User>', $query->lazy());
assertType('Hyperf\Collection\LazyCollection<int, Hyperf\Types\Builder\User>', $query->lazyById());
assertType('Hyperf\Collection\LazyCollection<int, Hyperf\Types\Builder\User>', $query->lazyByIdDesc());
assertType('Hyperf\Collection\Collection<(int|string), mixed>', $query->pluck('foo'));
assertType('Hyperf\Database\Model\Relations\Relation<Hyperf\Database\Model\Model, Hyperf\Types\Builder\User, *>', $query->getRelation('foo'));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $query->setModel(new Post()));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->has('foo', callback: function ($query) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Database\Model\Model>', $query);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->has($user->posts(), callback: function ($query) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $query);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->orHas($user->posts()));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->doesntHave($user->posts(), callback: function ($query) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $query);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->orDoesntHave($user->posts()));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->whereHas($user->posts(), function ($query) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $query);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->withWhereHas('posts', function ($query) {
assertType('Hyperf\Database\Model\Builder<*>|Hyperf\Database\Model\Relations\Relation<*, *, *>', $query);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->orWhereHas($user->posts(), function ($query) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $query);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->whereDoesntHave($user->posts(), function ($query) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $query);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->orWhereDoesntHave($user->posts(), function ($query) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $query);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->hasMorph($post->taggable(), 'taggable', callback: function ($query, $type) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Database\Model\Model>', $query);
assertType('string', $type);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->orHasMorph($post->taggable(), 'taggable'));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->doesntHaveMorph($post->taggable(), 'taggable', callback: function ($query, $type) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Database\Model\Model>', $query);
assertType('string', $type);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->orDoesntHaveMorph($post->taggable(), 'taggable'));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->whereHasMorph($post->taggable(), 'taggable', function ($query, $type) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Database\Model\Model>', $query);
assertType('string', $type);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->orWhereHasMorph($post->taggable(), 'taggable', function ($query, $type) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Database\Model\Model>', $query);
assertType('string', $type);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->whereDoesntHaveMorph($post->taggable(), 'taggable', function ($query, $type) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Database\Model\Model>', $query);
assertType('string', $type);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->orWhereDoesntHaveMorph($post->taggable(), 'taggable', function ($query, $type) {
assertType('Hyperf\Database\Model\Builder<Hyperf\Database\Model\Model>', $query);
assertType('string', $type);
}));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->whereRelation($user->posts(), 'id', 1));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->orWhereRelation($user->posts(), 'id', 1));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->whereMorphRelation($post->taggable(), 'taggable', 'id', 1));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\User>', $query->orWhereMorphRelation($post->taggable(), 'taggable', 'id', 1));
$query->chunk(1, function ($users, $page) {
assertType('Hyperf\Database\Model\Collection<int, Hyperf\Types\Builder\User>', $users);
assertType('int', $page);
});
$query->chunkById(1, function ($users, $page) {
assertType('Hyperf\Database\Model\Collection<int, Hyperf\Types\Builder\User>', $users);
assertType('int', $page);
});
$query->chunkMap(function ($users) {
assertType('Hyperf\Types\Builder\User', $users);
});
$query->chunkByIdDesc(1, function ($users, $page) {
assertType('Hyperf\Database\Model\Collection<int, Hyperf\Types\Builder\User>', $users);
assertType('int', $page);
});
$query->each(function ($users, $page) {
assertType('Hyperf\Types\Builder\User', $users);
assertType('int', $page);
});
$query->eachById(function ($users, $page) {
assertType('Hyperf\Types\Builder\User', $users);
assertType('int', $page);
});
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', Post::query());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', Post::on());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', Post::onWriteConnection());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', Post::with([]));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $post->newQuery());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $post->newModelQuery());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $post->newQueryWithoutRelationships());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $post->newQueryWithoutScopes());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $post->newQueryWithoutScope('foo'));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $post->newQueryForRestoration(1));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Post>', $post->newQuery()->where('foo', 'bar'));
assertType('Hyperf\Types\Builder\Post', $post->newQuery()->create(['name' => 'John']));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\ChildPost>', ChildPost::query());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\ChildPost>', ChildPost::on());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\ChildPost>', ChildPost::onWriteConnection());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\ChildPost>', ChildPost::with([]));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\ChildPost>', $childPost->newQuery());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\ChildPost>', $childPost->newModelQuery());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\ChildPost>', $childPost->newQueryWithoutRelationships());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\ChildPost>', $childPost->newQueryWithoutScopes());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\ChildPost>', $childPost->newQueryWithoutScope('foo'));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\ChildPost>', $childPost->newQueryForRestoration(1));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\ChildPost>', $childPost->newQuery()->where('foo', 'bar'));
assertType('Hyperf\Types\Builder\ChildPost', $childPost->newQuery()->create(['name' => 'John']));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Comment>', Comment::query());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Comment>', Comment::on());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Comment>', Comment::onWriteConnection());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Comment>', Comment::with([]));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Comment>', $comment->newQuery());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Comment>', $comment->newModelQuery());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Comment>', $comment->newQueryWithoutRelationships());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Comment>', $comment->newQueryWithoutScopes());
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Comment>', $comment->newQueryWithoutScope('foo'));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Comment>', $comment->newQueryForRestoration(1));
assertType('Hyperf\Database\Model\Builder<Hyperf\Types\Builder\Comment>', $comment->newQuery()->where('foo', 'bar'));
assertType('Hyperf\Types\Builder\Comment', $comment->newQuery()->create(['name' => 'John']));
}
class User extends Model
{
/** @return HasMany<Post, $this> */
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
}
class Post extends Model
{
/** @return BelongsTo<User, $this> */
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
/** @return MorphTo<Model, $this> */
public function taggable(): MorphTo
{
return $this->morphTo();
}
}
class ChildPost extends Post
{
}
class Comment extends Model
{
}
/**
* @template TModel of \Hyperf\Database\Model\Model
*
* @extends \Hyperf\Database\Model\Builder<TModel>
*/
class CommonBuilder extends Builder
{
public function foo(): static
{
return $this->where('foo', 'bar');
}
}
/** @extends CommonBuilder<Comment> */
class CommentBuilder extends CommonBuilder
{
}