Skip to content

Commit 37743d4

Browse files
committed
Add Query Builder test for lateral join methods
1 parent a0a528f commit 37743d4

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

tests/Database/DatabaseQueryBuilderTest.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2526,6 +2526,70 @@ public function testRightJoinSub()
25262526
$builder->from('users')->rightJoinSub(['foo'], 'sub', 'users.id', '=', 'sub.id');
25272527
}
25282528

2529+
public function testJoinLateral()
2530+
{
2531+
$builder = $this->getBuilder();
2532+
$builder->from('users')->joinLateral('select * from "contacts" where "contracts"."user_id" = "users"."id"', 'sub');
2533+
$this->assertSame('select * from "users" inner join lateral (select * from "contacts" where "contracts"."user_id" = "users"."id") as "sub" on true', $builder->toSql());
2534+
2535+
$builder = $this->getBuilder();
2536+
$builder->from('users')->joinLateral(function ($q) {
2537+
$q->from('contacts')->whereColumn('contracts.user_id', 'users.id');
2538+
}, 'sub');
2539+
$this->assertSame('select * from "users" inner join lateral (select * from "contacts" where "contracts"."user_id" = "users"."id") as "sub" on true', $builder->toSql());
2540+
2541+
$builder = $this->getBuilder();
2542+
$eloquentBuilder = new EloquentBuilder($this->getBuilder()->from('contacts')->whereColumn('contracts.user_id', 'users.id'));
2543+
$builder->from('users')->joinLateral($eloquentBuilder, 'sub');
2544+
$this->assertSame('select * from "users" inner join lateral (select * from "contacts" where "contracts"."user_id" = "users"."id") as "sub" on true', $builder->toSql());
2545+
2546+
$builder = $this->getBuilder();
2547+
$sub1 = $this->getBuilder()->from('contacts')->whereColumn('contracts.user_id', 'users.id')->where('name', 'foo');
2548+
$sub2 = $this->getBuilder()->from('contacts')->whereColumn('contracts.user_id', 'users.id')->where('name', 'bar');
2549+
$builder->from('users')
2550+
->joinLateral($sub1, 'sub1')
2551+
->joinLateral($sub2, 'sub2');
2552+
$expected = 'select * from "users" ';
2553+
$expected .= 'inner join lateral (select * from "contacts" where "contracts"."user_id" = "users"."id" and "name" = ?) as "sub1" on true ';
2554+
$expected .= 'inner join lateral (select * from "contacts" where "contracts"."user_id" = "users"."id" and "name" = ?) as "sub2" on true';
2555+
$this->assertEquals($expected, $builder->toSql());
2556+
$this->assertEquals(['foo', 'bar'], $builder->getRawBindings()['join']);
2557+
2558+
$this->expectException(InvalidArgumentException::class);
2559+
$builder = $this->getBuilder();
2560+
$builder->from('users')->joinLateral(['foo'], 'sub');
2561+
}
2562+
2563+
public function testJoinLateralWithPrefix()
2564+
{
2565+
$builder = $this->getBuilder();
2566+
$builder->getGrammar()->setTablePrefix('prefix_');
2567+
$builder->from('users')->joinLateral('select * from "contacts" where "contracts"."user_id" = "users"."id"', 'sub');
2568+
$this->assertSame('select * from "prefix_users" inner join lateral (select * from "contacts" where "contracts"."user_id" = "users"."id") as "prefix_sub" on true', $builder->toSql());
2569+
}
2570+
2571+
public function testLeftJoinLateral()
2572+
{
2573+
$builder = $this->getBuilder();
2574+
$builder->from('users')->leftJoinLateral($this->getBuilder()->from('contacts')->whereColumn('contracts.user_id', 'users.id'), 'sub');
2575+
$this->assertSame('select * from "users" left join lateral (select * from "contacts" where "contracts"."user_id" = "users"."id") as "sub" on true', $builder->toSql());
2576+
2577+
$this->expectException(InvalidArgumentException::class);
2578+
$builder = $this->getBuilder();
2579+
$builder->from('users')->leftJoinLateral(['foo'], 'sub');
2580+
}
2581+
2582+
public function testRightJoinLateral()
2583+
{
2584+
$builder = $this->getBuilder();
2585+
$builder->from('users')->rightJoinLateral($this->getBuilder()->from('contacts')->whereColumn('contracts.user_id', 'users.id'), 'sub');
2586+
$this->assertSame('select * from "users" right join lateral (select * from "contacts" where "contracts"."user_id" = "users"."id") as "sub" on true', $builder->toSql());
2587+
2588+
$this->expectException(InvalidArgumentException::class);
2589+
$builder = $this->getBuilder();
2590+
$builder->from('users')->rightJoinLateral(['foo'], 'sub');
2591+
}
2592+
25292593
public function testRawExpressionsInSelect()
25302594
{
25312595
$builder = $this->getBuilder();

0 commit comments

Comments
 (0)