diff --git a/src/Query/Grammars/PostgresGrammar.php b/src/Query/Grammars/PostgresGrammar.php index 158c8b1..464598d 100644 --- a/src/Query/Grammars/PostgresGrammar.php +++ b/src/Query/Grammars/PostgresGrammar.php @@ -46,6 +46,14 @@ public function compileInsertOrIgnore(Builder $query, array $values) return $this->compileInsert($query, $values) . ' on conflict do nothing'; } + /** + * Compile an insert ignore statement using a subquery into SQL. + */ + public function compileInsertOrIgnoreUsing(Builder $query, array $columns, string $sql): string + { + return $this->compileInsertUsing($query, $columns, $sql) . ' on conflict do nothing'; + } + /** * Compile an insert and get ID statement into SQL. * diff --git a/tests/Cases/DatabasePostgresBuilderTest.php b/tests/Cases/DatabasePostgresBuilderTest.php index 8f50173..35c7598 100644 --- a/tests/Cases/DatabasePostgresBuilderTest.php +++ b/tests/Cases/DatabasePostgresBuilderTest.php @@ -236,6 +236,29 @@ public function testWhereFullTextForReal() $this->assertCount(1, $result); } + #[RequiresPhpExtension('swoole', '< 6.0')] + public function testPostgresInsertOrIgnoreUsingMethod() + { + $builder = $this->getPostgresBuilderWithProcessor(); + /** + * @var ConnectionInterface&m\MockInterface $connection + */ + $connection = $builder->getConnection(); + $connection->allows('affectingStatement')->andReturnUsing(function ($query, $bindings) { + $this->assertEquals('insert into "table1" ("foo") select "bar" from "table2" where "foreign_id" = ? on conflict do nothing', $query); + $this->assertEquals([5], $bindings); + return 1; + }); + $result = $builder->from('table1')->insertOrIgnoreUsing( + ['foo'], + function (Builder $query) { + $query->select(['bar'])->from('table2')->where('foreign_id', '=', 5); + } + ); + + $this->assertEquals(1, $result); + } + protected function getBuilder($connection): PostgresBuilder { return new PostgresBuilder($connection);