@@ -4432,6 +4432,150 @@ public function testWhereJsonDoesntContainSqlServer()
4432
4432
$ this ->assertEquals ([1 ], $ builder ->getBindings ());
4433
4433
}
4434
4434
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
+
4435
4579
public function testWhereJsonLengthMySql ()
4436
4580
{
4437
4581
$ builder = $ this ->getMySqlBuilder ();
0 commit comments