Skip to content

Commit 1007539

Browse files
committed
refactor(database): replace generic exceptions with custom PrimaryKeyWasNotInitialized and PropertyWasNotARelation
1 parent 5684a1c commit 1007539

4 files changed

Lines changed: 41 additions & 10 deletions

File tree

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Database\Exceptions;
6+
7+
use Exception;
8+
9+
final class PrimaryKeyWasNotInitialized extends Exception
10+
{
11+
public function __construct(
12+
public readonly string $model,
13+
) {
14+
parent::__construct("Cannot query relations on `{$model}` without a primary key value.");
15+
}
16+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Database\Exceptions;
6+
7+
use Exception;
8+
9+
final class PropertyWasNotARelation extends Exception
10+
{
11+
public function __construct(
12+
public readonly string $property,
13+
public readonly string $model,
14+
) {
15+
parent::__construct("Property `{$property}` is not a relation on `{$model}`.");
16+
}
17+
}

packages/database/src/IsDatabaseModel.php

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44

55
namespace Tempest\Database;
66

7-
use InvalidArgumentException;
87
use Tempest\Database\Builder\QueryBuilders\CountQueryBuilder;
98
use Tempest\Database\Builder\QueryBuilders\InsertQueryBuilder;
109
use Tempest\Database\Builder\QueryBuilders\QueryBuilder;
1110
use Tempest\Database\Builder\QueryBuilders\SelectQueryBuilder;
11+
use Tempest\Database\Exceptions\PrimaryKeyWasNotInitialized;
12+
use Tempest\Database\Exceptions\PropertyWasNotARelation;
1213
use Tempest\Database\Exceptions\RelationWasMissing;
1314
use Tempest\Database\Exceptions\ValueWasMissing;
1415
use Tempest\Reflection\PropertyReflector;
@@ -273,17 +274,13 @@ public function query(string $relation): QueryBuilder
273274
$model = inspect(model: $this);
274275

275276
if (! $model->hasPrimaryKey() || ! $model->getPrimaryKeyProperty()->isInitialized(object: $this)) {
276-
throw new InvalidArgumentException(
277-
message: sprintf('Cannot query relations on %s without a primary key value.', $model->getName()),
278-
);
277+
throw new PrimaryKeyWasNotInitialized(model: $model->getName());
279278
}
280279

281280
$resolved = $model->getRelation(name: $relation);
282281

283282
if ($resolved === null) {
284-
throw new InvalidArgumentException(
285-
message: sprintf('Property "%s" is not a relation on %s.', $relation, $model->getName()),
286-
);
283+
throw new PropertyWasNotARelation(property: $relation, model: $model->getName());
287284
}
288285

289286
return $resolved->query(

tests/Integration/Database/Builder/IsDatabaseModelTest.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
use Carbon\Carbon;
88
use DateTime as NativeDateTime;
99
use DateTimeImmutable;
10-
use InvalidArgumentException;
1110
use Tempest\Database\BelongsTo;
1211
use Tempest\Database\Builder\QueryBuilders\QueryBuilder;
1312
use Tempest\Database\Builder\QueryBuilders\SelectQueryBuilder;
1413
use Tempest\Database\Exceptions\DeleteStatementWasInvalid;
14+
use Tempest\Database\Exceptions\PrimaryKeyWasNotInitialized;
15+
use Tempest\Database\Exceptions\PropertyWasNotARelation;
1516
use Tempest\Database\Exceptions\RelationWasMissing;
1617
use Tempest\Database\Exceptions\ValueWasMissing;
1718
use Tempest\Database\HasMany;
@@ -851,7 +852,7 @@ public function test_query_throws_for_nonexistent_property(): void
851852

852853
$author = Author::create(name: 'Author', type: AuthorType::A);
853854

854-
$this->expectException(InvalidArgumentException::class);
855+
$this->expectException(PropertyWasNotARelation::class);
855856

856857
$author->query('nonexistent');
857858
}
@@ -860,7 +861,7 @@ public function test_query_throws_for_unsaved_model(): void
860861
{
861862
$author = new Author(name: 'Unsaved');
862863

863-
$this->expectException(InvalidArgumentException::class);
864+
$this->expectException(PrimaryKeyWasNotInitialized::class);
864865

865866
$author->query('books');
866867
}

0 commit comments

Comments
 (0)