diff --git a/src/Query.php b/src/Query.php index 46b71d9..8a95429 100644 --- a/src/Query.php +++ b/src/Query.php @@ -38,7 +38,13 @@ public static function serialize(FluentQueryBuilder $builder): array 'orders' => $builder->orders, 'limit' => $builder->limit, 'offset' => $builder->offset, - 'unions' => $builder->unions, + 'unions' => collect($builder->unions)->map(static function ($union) { + if (isset($union['query'])) { + $union['query'] = static::serialize($union['query']); + } + + return $union; + })->all(), 'unionLimit' => $builder->unionLimit, 'unionOrders' => $builder->unionOrders, 'lock' => $builder->lock, @@ -73,6 +79,14 @@ public static function unserializeFor(FluentQueryBuilder $builder, array $payloa } } + if ($type === 'unions') { + foreach ($value as $index => $union) { + if (isset($union['query']) && \is_array($union['query'])) { + $value[$index]['query'] = static::unserialize($union['query']); + } + } + } + if ($type === 'joins') { $value = JoinClause::unserialize($builder, $value ?? []); } diff --git a/tests/Feature/QueryTest.php b/tests/Feature/QueryTest.php index e95ecf7..db46e47 100644 --- a/tests/Feature/QueryTest.php +++ b/tests/Feature/QueryTest.php @@ -48,4 +48,20 @@ public function it_can_serialize_a_basic_query_builder_with_wheres() $this->assertSame($builder->toSql(), $unserialize->toSql()); } + + /** @test */ + public function it_can_serialize_a_basic_query_builder_with_unions() + { + $builder = DB::table('users')->where('email', '=', 'crynobone@gmail.com'); + $union = DB::table('users')->where('email', '=', 'johndoe@gmail.com') + ->union($builder); + + $serialized = serialize($union); + + $unserialize = unserialize($serialized); + + $this->assertSame('select * from (select * from "users" where "email" = ?) union select * from (select * from "users" where "email" = ?)', $unserialize->toSql()); + + $this->assertSame($union->toSql(), $unserialize->toSql()); + } }