@@ -15,73 +15,78 @@ Feature: Eloquent Builder types
15
15
</plugins>
16
16
</psalm>
17
17
"""
18
+ And I have the following code preamble
19
+ """
20
+ <?php declare(strict_types=1);
21
+ namespace Tests\Psalm\LaravelPlugin\Sandbox;
22
+
23
+ use Illuminate\Database\Eloquent\Builder;
24
+ use Illuminate\Database\Eloquent\Collection;
25
+ use Tests\Psalm\LaravelPlugin\Models\User;
26
+ """
18
27
19
28
Scenario : Models can call eloquent query builder instance methods
20
29
Given I have the following code
21
30
"""
22
- <?php declare(strict_types=1);
23
-
24
- use Tests\Psalm\LaravelPlugin\Models\User;
25
-
26
31
final class UserRepository
27
32
{
28
33
29
34
/**
30
- * @return \Illuminate\Database\Eloquent\ Builder<User>
35
+ * @return Builder<User>
31
36
*/
32
- public function getNewQuery(): \Illuminate\Database\Eloquent\ Builder
37
+ public function getNewQuery(): Builder
33
38
{
34
39
return User::query();
35
40
}
36
41
37
42
/**
38
- * @return \Illuminate\Database\Eloquent\ Builder<User>
43
+ * @return Builder<User>
39
44
*/
40
- public function getNewModelQuery(): \Illuminate\Database\Eloquent\ Builder
45
+ public function getNewModelQuery(): Builder
41
46
{
42
47
return (new User())->newModelQuery();
43
48
}
44
49
45
50
/**
46
- * @param \Illuminate\Database\Eloquent\ Builder<User> $builder
51
+ * @param Builder<User> $builder
47
52
*/
48
- public function firstOrFailFromBuilderInstance(\Illuminate\Database\Eloquent\ Builder $builder): User {
53
+ public function firstOrFailFromBuilderInstance(Builder $builder): User {
49
54
return $builder->firstOrFail();
50
55
}
51
56
52
57
/**
53
- * @param \Illuminate\Database\Eloquent\ Builder<User> $builder
58
+ * @param Builder<User> $builder
54
59
*/
55
- public function findOrFailFromBuilderInstance(\Illuminate\Database\Eloquent\ Builder $builder): User {
60
+ public function findOrFailFromBuilderInstance(Builder $builder): User {
56
61
return $builder->findOrFail(1);
57
62
}
58
63
59
64
/**
60
- * @param \Illuminate\Database\Eloquent\ Builder<User> $builder
61
- * @return \Illuminate\Database\Eloquent\ Collection<User>
65
+ * @param Builder<User> $builder
66
+ * @return Collection<User>
62
67
*/
63
- public function findMultipleOrFailFromBuilderInstance(\Illuminate\Database\Eloquent\ Builder $builder): \Illuminate\Database\Eloquent\ Collection {
68
+ public function findMultipleOrFailFromBuilderInstance(Builder $builder): Collection {
64
69
return $builder->findOrFail([1, 2]);
65
70
}
66
71
67
72
/**
68
- * @param \Illuminate\Database\Eloquent\ Builder<User> $builder
73
+ * @param Builder<User> $builder
69
74
*/
70
- public function findOne(\Illuminate\Database\Eloquent\ Builder $builder): ?User {
75
+ public function findOne(Builder $builder): ?User {
71
76
return $builder->find(1);
72
77
}
73
78
74
79
/**
75
- * @param \Illuminate\Database\Eloquent\ Builder<User> $builder
80
+ * @param Builder<User> $builder
76
81
*/
77
- public function findViaArray(\Illuminate\Database\Eloquent\ Builder $builder): \Illuminate\Database\Eloquent\ Collection {
82
+ public function findViaArray(Builder $builder): Collection {
78
83
return $builder->find([1]);
79
84
}
80
85
81
86
/**
82
- * @return \Illuminate\Database\Eloquent\ Builder<User>
87
+ * @return Builder<User>
83
88
*/
84
- public function getWhereBuilderViaInstance(array $attributes): \Illuminate\Database\Eloquent\ Builder {
89
+ public function getWhereBuilderViaInstance(array $attributes): Builder {
85
90
return (new User())->where($attributes);
86
91
}
87
92
}
@@ -90,10 +95,16 @@ Feature: Eloquent Builder types
90
95
Then I see no errors
91
96
92
97
Scenario : can call static methods on model
93
- Given I have the following code
98
+ Given I have the following code preamble
94
99
"""
95
100
<?php declare(strict_types=1);
96
101
102
+ use Illuminate\Database\Eloquent\Builder;
103
+ use Illuminate\Database\Eloquent\Collection;
104
+ """
105
+ And I have the following code
106
+ """
107
+
97
108
final class User extends \Illuminate\Database\Eloquent\Model {
98
109
protected $table = 'users';
99
110
};
@@ -102,17 +113,17 @@ Feature: Eloquent Builder types
102
113
{
103
114
104
115
/**
105
- * @return \Illuminate\Database\Eloquent\ Builder<User>
116
+ * @return Builder<User>
106
117
*/
107
- public function getWhereBuilderViaStatic(array $attributes): \Illuminate\Database\Eloquent\ Builder
118
+ public function getWhereBuilderViaStatic(array $attributes): Builder
108
119
{
109
120
return User::where($attributes);
110
121
}
111
122
112
123
/**
113
- * @psalm-return \Illuminate\Database\Eloquent\ Collection<User>
124
+ * @psalm-return Collection<User>
114
125
*/
115
- public function getWhereViaStatic(array $attributes): \Illuminate\Database\Eloquent\ Collection
126
+ public function getWhereViaStatic(array $attributes): Collection
116
127
{
117
128
return User::where($attributes)->get();
118
129
}
@@ -122,20 +133,25 @@ Feature: Eloquent Builder types
122
133
Then I see no errors
123
134
124
135
Scenario :
125
- Given I have the following code
136
+ Given I have the following code preamble
126
137
"""
127
138
<?php declare(strict_types=1);
128
139
129
- final class User extends \Illuminate\Database\Eloquent\Model {
140
+ use Illuminate\Database\Eloquent\Builder;
141
+ use Illuminate\Database\Eloquent\Model;
142
+ """
143
+ And I have the following code
144
+ """
145
+ final class User extends Model {
130
146
protected $table = 'users';
131
147
};
132
148
133
149
final class UserRepository
134
150
{
135
151
/**
136
- * @return \Illuminate\Database\Eloquent\ Builder<User>
152
+ * @return Builder<User>
137
153
*/
138
- public function test_failure(): \Illuminate\Database\Eloquent\ Builder
154
+ public function test_failure(): Builder
139
155
{
140
156
return User::fakeQueryMethodThatDoesntExist();
141
157
}
@@ -150,11 +166,6 @@ Feature: Eloquent Builder types
150
166
Scenario : can call methods on underlying query builder
151
167
Given I have the following code
152
168
"""
153
- <?php declare(strict_types=1);
154
-
155
- use Tests\Psalm\LaravelPlugin\Models\User;
156
- use \Illuminate\Database\Eloquent\Builder;
157
-
158
169
/**
159
170
* @psalm-param Builder<User> $builder
160
171
* @psalm-return Builder<User>
@@ -165,3 +176,52 @@ Feature: Eloquent Builder types
165
176
"""
166
177
When I run Psalm
167
178
Then I see no errors
179
+
180
+ Scenario : cannot call firstOrNew and firstOrCreate without parameters in Laravel 6.x
181
+ Given I have the "laravel/framework" package satisfying the "6.*"
182
+ And I have the following code
183
+ """
184
+ /**
185
+ * @psalm-param Builder<User> $builder
186
+ * @psalm-return User
187
+ */
188
+ function test_firstOrCreate(Builder $builder): User {
189
+ return $builder->firstOrCreate();
190
+ }
191
+
192
+ /**
193
+ * @psalm-param Builder<User> $builder
194
+ * @psalm-return User
195
+ */
196
+ function test_firstOrNew(Builder $builder): User {
197
+ return $builder->firstOrNew();
198
+ }
199
+ """
200
+ When I run Psalm
201
+ Then I see these errors
202
+ | Type | Message |
203
+ | TooFewArguments | Too few arguments for method Illuminate \Database \Eloquent \Builder ::firstorcreate saw 0 |
204
+ | TooFewArguments | Too few arguments for method Illuminate \Database \Eloquent \Builder ::firstornew saw 0 |
205
+
206
+ Scenario : can call firstOrNew and firstOrCreate without parameters in Laravel 8.x
207
+ Given I have the "laravel/framework" package satisfying the ">= 8.0"
208
+ And I have the following code
209
+ """
210
+ /**
211
+ * @psalm-param Builder<User> $builder
212
+ * @psalm-return User
213
+ */
214
+ function test_firstOrCreate(Builder $builder): User {
215
+ return $builder->firstOrCreate();
216
+ }
217
+
218
+ /**
219
+ * @psalm-param Builder<User> $builder
220
+ * @psalm-return User
221
+ */
222
+ function test_firstOrNew(Builder $builder): User {
223
+ return $builder->firstOrNew();
224
+ }
225
+ """
226
+ When I run Psalm
227
+ Then I see no errors
0 commit comments