Skip to content

Commit d6c1373

Browse files
authored
Merge pull request #1012 from liamduckett/main
Improve QueryBuilder Generic Support
2 parents 4f937d8 + 0fd2e4f commit d6c1373

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

phpstan.neon.dist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ parameters:
88
- src/
99
- config/
1010
- database/
11+
- types/
1112

1213
# Level 9 is the highest level
1314
level: 5

src/QueryBuilder.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ public function getSubject(): Relation|EloquentBuilder
5151
}
5252

5353
/**
54-
* @param EloquentBuilder<TModel>|Relation|class-string<TModel> $subject
55-
* @return static<TModel>
54+
* @template T of Model
55+
*
56+
* @param EloquentBuilder<T>|Relation<T, *, *>|class-string<T> $subject
57+
* @return static<T>
5658
*/
5759
public static function for(
5860
EloquentBuilder|Relation|string $subject,
@@ -62,7 +64,7 @@ public static function for(
6264
$subject = $subject::query();
6365
}
6466

65-
/** @var static<TModel> $queryBuilder */
67+
/** @var static<T> $queryBuilder */
6668
$queryBuilder = new static($subject, $request);
6769

6870
return $queryBuilder;

types/query-builder.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
use Illuminate\Database\Eloquent\Model;
4+
use Illuminate\Database\Eloquent\Relations\BelongsTo;
5+
use Spatie\QueryBuilder\QueryBuilder;
6+
use function PHPStan\Testing\assertType;
7+
8+
class Book extends Model {
9+
/**
10+
* @return BelongsTo<Author, $this>
11+
*/
12+
public function author(): BelongsTo
13+
{
14+
return $this->belongsTo(Author::class);
15+
}
16+
}
17+
18+
class Author extends Model {}
19+
20+
assertType('Spatie\QueryBuilder\QueryBuilder<Book>', QueryBuilder::for(Book::class));
21+
assertType('Spatie\QueryBuilder\QueryBuilder<Book>', QueryBuilder::for(Book::query()));
22+
assertType('Spatie\QueryBuilder\QueryBuilder<Author>', QueryBuilder::for((new Book)->author()));

0 commit comments

Comments
 (0)