Skip to content

Commit 412c2d0

Browse files
authored
feat(database): allow overriding table names through model class attributes (#1060)
1 parent 355c757 commit 412c2d0

File tree

6 files changed

+72
-2
lines changed

6 files changed

+72
-2
lines changed

src/Tempest/Database/src/IsDatabaseModel.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Tempest\Database\Config\DatabaseConfig;
1010
use Tempest\Database\Exceptions\MissingRelation;
1111
use Tempest\Database\Exceptions\MissingValue;
12+
use Tempest\Database\TableName as TableNameAttribute;
1213
use Tempest\Reflection\ClassReflector;
1314
use Tempest\Reflection\PropertyReflector;
1415

@@ -57,10 +58,14 @@ public function getId(): Id
5758

5859
public static function table(): TableName
5960
{
60-
$name = get(DatabaseConfig::class)
61+
$specificName = new ClassReflector(static::class)
62+
->getAttribute(TableNameAttribute::class)
63+
?->name;
64+
65+
$conventionalName = get(DatabaseConfig::class)
6166
->namingStrategy->getName(self::class);
6267

63-
return new TableName($name);
68+
return new TableName($specificName ?? $conventionalName);
6469
}
6570

6671
public static function new(mixed ...$params): self
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Tempest\Database;
4+
5+
use Attribute;
6+
7+
#[Attribute(Attribute::TARGET_CLASS)]
8+
final class TableName
9+
{
10+
public function __construct(
11+
public string $name,
12+
) {
13+
}
14+
}

tests/Integration/ORM/IsDatabaseModelTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@
4242
use Tests\Tempest\Integration\ORM\Migrations\CreateHasManyChildTable;
4343
use Tests\Tempest\Integration\ORM\Migrations\CreateHasManyParentTable;
4444
use Tests\Tempest\Integration\ORM\Migrations\CreateHasManyThroughTable;
45+
use Tests\Tempest\Integration\ORM\Models\AttributeTableNameModel;
46+
use Tests\Tempest\Integration\ORM\Models\BaseModel;
47+
use Tests\Tempest\Integration\ORM\Models\StaticMethodTableNameModel;
4548

4649
/**
4750
* @internal
@@ -529,4 +532,11 @@ public function test_find(): void
529532

530533
$this->assertCount(0, $invalid);
531534
}
535+
536+
public function test_table_name_overrides(): void
537+
{
538+
$this->assertEquals('base_models', BaseModel::table()->tableName);
539+
$this->assertEquals('custom_attribute_table_name', AttributeTableNameModel::table()->tableName);
540+
$this->assertEquals('custom_static_method_table_name', StaticMethodTableNameModel::table()->tableName);
541+
}
532542
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Tests\Tempest\Integration\ORM\Models;
4+
5+
use Tempest\Database\DatabaseModel;
6+
use Tempest\Database\IsDatabaseModel;
7+
use Tempest\Database\TableName;
8+
9+
#[TableName('custom_attribute_table_name')]
10+
final class AttributeTableNameModel implements DatabaseModel
11+
{
12+
use IsDatabaseModel;
13+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Tests\Tempest\Integration\ORM\Models;
4+
5+
use Tempest\Database\DatabaseModel;
6+
use Tempest\Database\IsDatabaseModel;
7+
8+
final class BaseModel implements DatabaseModel
9+
{
10+
use IsDatabaseModel;
11+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Tests\Tempest\Integration\ORM\Models;
4+
5+
use Tempest\Database\Builder\TableName;
6+
use Tempest\Database\DatabaseModel;
7+
use Tempest\Database\IsDatabaseModel;
8+
9+
final class StaticMethodTableNameModel implements DatabaseModel
10+
{
11+
use IsDatabaseModel;
12+
13+
public static function table(): TableName
14+
{
15+
return new TableName('custom_static_method_table_name');
16+
}
17+
}

0 commit comments

Comments
 (0)