Skip to content

Commit

Permalink
fix: dont override return type when eloquent builder returns a query …
Browse files Browse the repository at this point in the history
…builder instance
  • Loading branch information
canvural committed Jul 24, 2020
1 parent c54b517 commit b5f96b4
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/Methods/BuilderHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -178,9 +178,15 @@ public function getMethodReflectionFromBuilder(
$returnType = $customReturnType;
}

$isBuilderReferenced = (count(array_intersect([EloquentBuilder::class, QueryBuilder::class], $returnType->getReferencedClasses())) > 0)
$isBuilderReferenced = (
count(array_intersect([EloquentBuilder::class, QueryBuilder::class], $returnType->getReferencedClasses())) > 0)
|| (new ObjectType(EloquentBuilder::class))->isSuperTypeOf($returnType)->yes();

// A special case for when return type is just the `QueryBuilder`
if ($returnType instanceof ObjectType && $returnType->getClassName() === QueryBuilder::class) {
$isBuilderReferenced = false;
}

if ($isBuilderReferenced) {
$returnType = $customReturnType;
}
Expand Down
28 changes: 28 additions & 0 deletions tests/Features/Methods/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

use App\User;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Database\Query\Builder as QueryBuilder;
use stdClass;

class Builder
{
Expand All @@ -28,4 +30,30 @@ public function testDynamicWhereAsInt(): ?User
{
return (new User())->whereFoo(1)->first();
}

public function testGetQueryReturnsQueryBuilder(): QueryBuilder
{
return User::getQuery();
}

public function testToBaseReturnsQueryBuilder(): QueryBuilder
{
return User::toBase();
}

public function testToBaseReturnsQueryBuilderAfterChain(): QueryBuilder
{
return User::whereNull('foo')
->orderBy('fooBar')
->toBase();
}

public function testQueryBuilderChainStartedWithGetQueryReturnsStdClass(): ?stdClass
{
return User::getQuery()
->select('some_model.created')
->where('some_model.some_column', '=', true)
->orderBy('some_model.created', 'desc')
->first();
}
}

0 comments on commit b5f96b4

Please sign in to comment.