@@ -4432,6 +4432,150 @@ public function testWhereJsonDoesntContainSqlServer()
44324432 $ this ->assertEquals ([1 ], $ builder ->getBindings ());
44334433 }
44344434
4435+ public function testWhereJsonContainsKeyMySql ()
4436+ {
4437+ $ builder = $ this ->getMySqlBuilder ();
4438+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('users.options->languages ' );
4439+ $ this ->assertSame ('select * from `users` where ifnull(json_contains_path(`users`.`options`, \'one \', \'$."languages" \'), 0) ' , $ builder ->toSql ());
4440+
4441+ $ builder = $ this ->getMySqlBuilder ();
4442+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('options->language->primary ' );
4443+ $ this ->assertSame ('select * from `users` where ifnull(json_contains_path(`options`, \'one \', \'$."language"."primary" \'), 0) ' , $ builder ->toSql ());
4444+
4445+ $ builder = $ this ->getMySqlBuilder ();
4446+ $ builder ->select ('* ' )->from ('users ' )->where ('id ' , '= ' , 1 )->orWhereJsonContainsKey ('options->languages ' );
4447+ $ this ->assertSame ('select * from `users` where `id` = ? or ifnull(json_contains_path(`options`, \'one \', \'$."languages" \'), 0) ' , $ builder ->toSql ());
4448+
4449+ $ builder = $ this ->getMySqlBuilder ();
4450+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('options->languages[0][1] ' );
4451+ $ this ->assertSame ('select * from `users` where ifnull(json_contains_path(`options`, \'one \', \'$."languages"[0][1] \'), 0) ' , $ builder ->toSql ());
4452+ }
4453+
4454+ public function testWhereJsonContainsKeyPostgres ()
4455+ {
4456+ $ builder = $ this ->getPostgresBuilder ();
4457+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('users.options->languages ' );
4458+ $ this ->assertSame ('select * from "users" where coalesce(("users"."options")::jsonb ?? \'languages \', false) ' , $ builder ->toSql ());
4459+
4460+ $ builder = $ this ->getPostgresBuilder ();
4461+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('options->language->primary ' );
4462+ $ this ->assertSame ('select * from "users" where coalesce(("options"-> \'language \')::jsonb ?? \'primary \', false) ' , $ builder ->toSql ());
4463+
4464+ $ builder = $ this ->getPostgresBuilder ();
4465+ $ builder ->select ('* ' )->from ('users ' )->where ('id ' , '= ' , 1 )->orWhereJsonContainsKey ('options->languages ' );
4466+ $ this ->assertSame ('select * from "users" where "id" = ? or coalesce(("options")::jsonb ?? \'languages \', false) ' , $ builder ->toSql ());
4467+
4468+ $ builder = $ this ->getPostgresBuilder ();
4469+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('options->languages[0][1] ' );
4470+ $ this ->assertSame ('select * from "users" where case when jsonb_typeof(("options"-> \'languages \'->0)::jsonb) = \'array \' then jsonb_array_length(("options"-> \'languages \'->0)::jsonb) >= 2 else false end ' , $ builder ->toSql ());
4471+
4472+ $ builder = $ this ->getPostgresBuilder ();
4473+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('options->languages[-1] ' );
4474+ $ this ->assertSame ('select * from "users" where case when jsonb_typeof(("options"-> \'languages \')::jsonb) = \'array \' then jsonb_array_length(("options"-> \'languages \')::jsonb) >= 1 else false end ' , $ builder ->toSql ());
4475+ }
4476+
4477+ public function testWhereJsonContainsKeySqlite ()
4478+ {
4479+ $ builder = $ this ->getSQLiteBuilder ();
4480+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('users.options->languages ' );
4481+ $ this ->assertSame ('select * from "users" where json_type("users"."options", \'$."languages" \') is not null ' , $ builder ->toSql ());
4482+
4483+ $ builder = $ this ->getSQLiteBuilder ();
4484+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('options->language->primary ' );
4485+ $ this ->assertSame ('select * from "users" where json_type("options", \'$."language"."primary" \') is not null ' , $ builder ->toSql ());
4486+
4487+ $ builder = $ this ->getSQLiteBuilder ();
4488+ $ builder ->select ('* ' )->from ('users ' )->where ('id ' , '= ' , 1 )->orWhereJsonContainsKey ('options->languages ' );
4489+ $ this ->assertSame ('select * from "users" where "id" = ? or json_type("options", \'$."languages" \') is not null ' , $ builder ->toSql ());
4490+
4491+ $ builder = $ this ->getSQLiteBuilder ();
4492+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('options->languages[0][1] ' );
4493+ $ this ->assertSame ('select * from "users" where json_type("options", \'$."languages"[0][1] \') is not null ' , $ builder ->toSql ());
4494+ }
4495+
4496+ public function testWhereJsonContainsKeySqlServer ()
4497+ {
4498+ $ builder = $ this ->getSqlServerBuilder ();
4499+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('users.options->languages ' );
4500+ $ this ->assertSame ('select * from [users] where \'languages \' in (select [key] from openjson([users].[options])) ' , $ builder ->toSql ());
4501+
4502+ $ builder = $ this ->getSqlServerBuilder ();
4503+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('options->language->primary ' );
4504+ $ this ->assertSame ('select * from [users] where \'primary \' in (select [key] from openjson([options], \'$."language" \')) ' , $ builder ->toSql ());
4505+
4506+ $ builder = $ this ->getSqlServerBuilder ();
4507+ $ builder ->select ('* ' )->from ('users ' )->where ('id ' , '= ' , 1 )->orWhereJsonContainsKey ('options->languages ' );
4508+ $ this ->assertSame ('select * from [users] where [id] = ? or \'languages \' in (select [key] from openjson([options])) ' , $ builder ->toSql ());
4509+
4510+ $ builder = $ this ->getSqlServerBuilder ();
4511+ $ builder ->select ('* ' )->from ('users ' )->whereJsonContainsKey ('options->languages[0][1] ' );
4512+ $ this ->assertSame ('select * from [users] where 1 in (select [key] from openjson([options], \'$."languages"[0] \')) ' , $ builder ->toSql ());
4513+ }
4514+
4515+ public function testWhereJsonDoesntContainKeyMySql ()
4516+ {
4517+ $ builder = $ this ->getMySqlBuilder ();
4518+ $ builder ->select ('* ' )->from ('users ' )->whereJsonDoesntContainKey ('options->languages ' );
4519+ $ this ->assertSame ('select * from `users` where not ifnull(json_contains_path(`options`, \'one \', \'$."languages" \'), 0) ' , $ builder ->toSql ());
4520+
4521+ $ builder = $ this ->getMySqlBuilder ();
4522+ $ builder ->select ('* ' )->from ('users ' )->where ('id ' , '= ' , 1 )->orWhereJsonDoesntContainKey ('options->languages ' );
4523+ $ this ->assertSame ('select * from `users` where `id` = ? or not ifnull(json_contains_path(`options`, \'one \', \'$."languages" \'), 0) ' , $ builder ->toSql ());
4524+
4525+ $ builder = $ this ->getMySqlBuilder ();
4526+ $ builder ->select ('* ' )->from ('users ' )->whereJsonDoesntContainKey ('options->languages[0][1] ' );
4527+ $ this ->assertSame ('select * from `users` where not ifnull(json_contains_path(`options`, \'one \', \'$."languages"[0][1] \'), 0) ' , $ builder ->toSql ());
4528+ }
4529+
4530+ public function testWhereJsonDoesntContainKeyPostgres ()
4531+ {
4532+ $ builder = $ this ->getPostgresBuilder ();
4533+ $ builder ->select ('* ' )->from ('users ' )->whereJsonDoesntContainKey ('options->languages ' );
4534+ $ this ->assertSame ('select * from "users" where not coalesce(("options")::jsonb ?? \'languages \', false) ' , $ builder ->toSql ());
4535+
4536+ $ builder = $ this ->getPostgresBuilder ();
4537+ $ builder ->select ('* ' )->from ('users ' )->where ('id ' , '= ' , 1 )->orWhereJsonDoesntContainKey ('options->languages ' );
4538+ $ this ->assertSame ('select * from "users" where "id" = ? or not coalesce(("options")::jsonb ?? \'languages \', false) ' , $ builder ->toSql ());
4539+
4540+ $ builder = $ this ->getPostgresBuilder ();
4541+ $ builder ->select ('* ' )->from ('users ' )->whereJsonDoesntContainKey ('options->languages[0][1] ' );
4542+ $ this ->assertSame ('select * from "users" where not case when jsonb_typeof(("options"-> \'languages \'->0)::jsonb) = \'array \' then jsonb_array_length(("options"-> \'languages \'->0)::jsonb) >= 2 else false end ' , $ builder ->toSql ());
4543+
4544+ $ builder = $ this ->getPostgresBuilder ();
4545+ $ builder ->select ('* ' )->from ('users ' )->whereJsonDoesntContainKey ('options->languages[-1] ' );
4546+ $ this ->assertSame ('select * from "users" where not case when jsonb_typeof(("options"-> \'languages \')::jsonb) = \'array \' then jsonb_array_length(("options"-> \'languages \')::jsonb) >= 1 else false end ' , $ builder ->toSql ());
4547+ }
4548+
4549+ public function testWhereJsonDoesntContainKeySqlite ()
4550+ {
4551+ $ builder = $ this ->getSQLiteBuilder ();
4552+ $ builder ->select ('* ' )->from ('users ' )->whereJsonDoesntContainKey ('options->languages ' );
4553+ $ this ->assertSame ('select * from "users" where not json_type("options", \'$."languages" \') is not null ' , $ builder ->toSql ());
4554+
4555+ $ builder = $ this ->getSQLiteBuilder ();
4556+ $ builder ->select ('* ' )->from ('users ' )->where ('id ' , '= ' , 1 )->orWhereJsonDoesntContainKey ('options->languages ' );
4557+ $ this ->assertSame ('select * from "users" where "id" = ? or not json_type("options", \'$."languages" \') is not null ' , $ builder ->toSql ());
4558+
4559+ $ builder = $ this ->getSQLiteBuilder ();
4560+ $ builder ->select ('* ' )->from ('users ' )->where ('id ' , '= ' , 1 )->orWhereJsonDoesntContainKey ('options->languages[0][1] ' );
4561+ $ this ->assertSame ('select * from "users" where "id" = ? or not json_type("options", \'$."languages"[0][1] \') is not null ' , $ builder ->toSql ());
4562+ }
4563+
4564+ public function testWhereJsonDoesntContainKeySqlServer ()
4565+ {
4566+ $ builder = $ this ->getSqlServerBuilder ();
4567+ $ builder ->select ('* ' )->from ('users ' )->whereJsonDoesntContainKey ('options->languages ' );
4568+ $ this ->assertSame ('select * from [users] where not \'languages \' in (select [key] from openjson([options])) ' , $ builder ->toSql ());
4569+
4570+ $ builder = $ this ->getSqlServerBuilder ();
4571+ $ builder ->select ('* ' )->from ('users ' )->where ('id ' , '= ' , 1 )->orWhereJsonDoesntContainKey ('options->languages ' );
4572+ $ this ->assertSame ('select * from [users] where [id] = ? or not \'languages \' in (select [key] from openjson([options])) ' , $ builder ->toSql ());
4573+
4574+ $ builder = $ this ->getSqlServerBuilder ();
4575+ $ builder ->select ('* ' )->from ('users ' )->where ('id ' , '= ' , 1 )->orWhereJsonDoesntContainKey ('options->languages[0][1] ' );
4576+ $ this ->assertSame ('select * from [users] where [id] = ? or not 1 in (select [key] from openjson([options], \'$."languages"[0] \')) ' , $ builder ->toSql ());
4577+ }
4578+
44354579 public function testWhereJsonLengthMySql ()
44364580 {
44374581 $ builder = $ this ->getMySqlBuilder ();
0 commit comments