Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 7a0f0bc

Browse files
Support adding schema validation (#3397)
To support the '$jsonSchema' operation on collections
1 parent f464797 commit 7a0f0bc

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

‎src/Schema/Blueprint.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use MongoDB\Laravel\Connection;
1010

1111
use function array_flip;
12+
use function array_merge;
1213
use function implode;
1314
use function in_array;
1415
use function is_array;
@@ -117,6 +118,24 @@ public function hasIndex($indexOrColumns = null)
117118
return false;
118119
}
119120

121+
public function jsonSchema(
122+
array $schema = [],
123+
?string $validationLevel = null,
124+
?string $validationAction = null,
125+
): void {
126+
$options = array_merge(
127+
[
128+
'validator' => [
129+
'$jsonSchema' => $schema,
130+
],
131+
],
132+
$validationLevel ? ['validationLevel' => $validationLevel] : [],
133+
$validationAction ? ['validationAction' => $validationAction] : [],
134+
);
135+
136+
$this->connection->getDatabase()->modifyCollection($this->collection->getCollectionName(), $options);
137+
}
138+
120139
/**
121140
* @param string|array $indexOrColumns
122141
*

‎tests/SchemaTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,39 @@ public function testCreateWithOptions(): void
6363
$this->assertEquals(1024, $collection['options']['size']);
6464
}
6565

66+
public function testCreateWithSchemaValidator(): void
67+
{
68+
$schema = [
69+
'bsonType' => 'object',
70+
'required' => [ 'username' ],
71+
'properties' => [
72+
'username' => [
73+
'bsonType' => 'string',
74+
'description' => 'must be a string and is required',
75+
],
76+
],
77+
];
78+
79+
Schema::create(self::COLL_2, function (Blueprint $collection) use ($schema) {
80+
$collection->string('username');
81+
$collection->jsonSchema(schema: $schema, validationAction: 'warn');
82+
});
83+
84+
$this->assertTrue(Schema::hasCollection(self::COLL_2));
85+
$this->assertTrue(Schema::hasTable(self::COLL_2));
86+
87+
$collection = Schema::getCollection(self::COLL_2);
88+
$this->assertEquals(
89+
['$jsonSchema' => $schema],
90+
$collection['options']['validator'],
91+
);
92+
93+
$this->assertEquals(
94+
'warn',
95+
$collection['options']['validationAction'],
96+
);
97+
}
98+
6699
public function testDrop(): void
67100
{
68101
Schema::create(self::COLL_1);

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /