Skip to content

Commit 91fad3f

Browse files
committed
Support hasColumn for nested id
1 parent 85aa4de commit 91fad3f

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

src/Schema/Builder.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use function array_fill_keys;
1212
use function array_filter;
1313
use function array_keys;
14+
use function array_map;
1415
use function assert;
1516
use function count;
1617
use function current;
@@ -19,6 +20,8 @@
1920
use function iterator_to_array;
2021
use function sort;
2122
use function sprintf;
23+
use function str_ends_with;
24+
use function substr;
2225
use function usort;
2326

2427
class Builder extends \Illuminate\Database\Schema\Builder
@@ -42,9 +45,12 @@ public function hasColumn($table, $column): bool
4245
*/
4346
public function hasColumns($table, array $columns): bool
4447
{
45-
// The field "id" (alias of "_id") is required for all MongoDB documents
48+
// The field "id" (alias of "_id") always exist on MongoDB collections
4649
$columns = array_filter($columns, fn (string $column): bool => ! in_array($column, ['_id', 'id'], true));
4750

51+
// Any subfield named "*.id" is an alias of "*._id"
52+
$columns = array_map(fn (string $column): string => str_ends_with($column, '.id') ? substr($column, 0, -3) . '._id' : $column, $columns);
53+
4854
if ($columns === []) {
4955
return true;
5056
}

tests/SchemaTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,10 +377,12 @@ public function testHasColumn(): void
377377
$this->assertTrue(Schema::hasColumn('newcollection', '_id'));
378378
$this->assertTrue(Schema::hasColumn('newcollection', 'id'));
379379

380-
DB::connection()->table('newcollection')->insert(['column1' => 'value']);
380+
DB::connection()->table('newcollection')->insert(['column1' => 'value', 'embed' => ['_id' => 1]]);
381381

382382
$this->assertTrue(Schema::hasColumn('newcollection', 'column1'));
383383
$this->assertFalse(Schema::hasColumn('newcollection', 'column2'));
384+
$this->assertTrue(Schema::hasColumn('newcollection', 'embed._id'));
385+
$this->assertTrue(Schema::hasColumn('newcollection', 'embed.id'));
384386
}
385387

386388
public function testHasColumns(): void

0 commit comments

Comments
 (0)