1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
<?php
declare(strict_types=1);
namespace Doctrine\DBAL\Tests\Functional\Types;
use Doctrine\DBAL\ParameterType;
use Doctrine\DBAL\Schema\Column;
use Doctrine\DBAL\Schema\PrimaryKeyConstraint;
use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Tests\FunctionalTestCase;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Types\Types;
use function is_resource;
use function json_decode;
use function ksort;
use function stream_get_contents;
class JsonTest extends FunctionalTestCase
{
protected function setUp(): void
{
$table = Table::editor()
->setUnquotedName('json_test_table')
->setColumns(
Column::editor()
->setUnquotedName('id')
->setTypeName(Types::INTEGER)
->create(),
Column::editor()
->setUnquotedName('val')
->setTypeName(Types::JSON)
->create(),
)
->setPrimaryKeyConstraint(
PrimaryKeyConstraint::editor()
->setUnquotedColumnNames('id')
->create(),
)
->create();
$this->dropAndCreateTable($table);
}
public function testInsertAndSelect(): void
{
$id1 = 1;
$id2 = 2;
$value1 = [
'firstKey' => 'firstVal',
'secondKey' => 'secondVal',
'nestedKey' => [
'nestedKey1' => 'nestedVal1',
'nestedKey2' => 2,
],
];
$value2 = json_decode('{"key1":"Val1","key2":2,"key3":"Val3"}', true);
$this->insert($id1, $value1);
$this->insert($id2, $value2);
$res1 = $this->select($id1);
$res2 = $this->select($id2);
// The returned arrays are not guaranteed to be in the same order so sort them
ksort($value1);
ksort($value2);
ksort($res1);
ksort($res2);
self::assertSame($value1, $res1);
self::assertSame($value2, $res2);
}
/** @param array<mixed> $value */
private function insert(int $id, array $value): void
{
$result = $this->connection->insert('json_test_table', [
'id' => $id,
'val' => $value,
], [
ParameterType::INTEGER,
Type::getType(Types::JSON),
]);
self::assertSame(1, $result);
}
/** @return array<mixed> */
private function select(int $id): array
{
$value = $this->connection->fetchOne(
'SELECT val FROM json_test_table WHERE id = ?',
[$id],
[ParameterType::INTEGER],
);
if (is_resource($value)) {
$value = stream_get_contents($value);
}
self::assertIsString($value);
$value = json_decode($value, true);
self::assertIsArray($value);
return $value;
}
}
|