In Laravel and Pest tests, assertDatabaseHas() natively queries nested JSON properties using arrow syntax and accepts backed Enum instances directly.
Testing JSON attributes or PHP backed enums in database assertions requires no manual casting, JSON encoding, or ->value calls.
assertDatabaseHas() natively serializes backed enums and translates arrow notation into database JSON queries.
Code Examples
use App\Enums\UserRole;
// In Pest tests:
assertDatabaseHas('users', [
'role' => UserRole::Maintainer, // Serializes backed enum automatically
'settings->theme' => 'dark', // Queries nested JSON key
'settings->notifications->email' => true,
]);
// In PHPUnit tests:
$this->assertDatabaseHas('users', [
'role' => UserRole::Maintainer,
'settings->theme' => 'dark',
]);
Key Benefits
- Enum Serialization: Passes backed enum instances directly without manual
->valueextraction. - Nested JSON Traversal: Arrow syntax (
settings->theme) queries database JSON paths across MySQL, PostgreSQL, and SQLite. - Framework Agnostic: Works identically in both Pest test functions and PHPUnit test cases.
Related Tips
View all tips →Ditch sleep() in Tests: Use Laravel Time Travel Helpers
Use $this->travelTo() or freezeTime() in test suites to test date-sensitive logic without slowing down test execution with sleep().
Cast Enums Inside JSON and Array Column Keys in Eloquent
Cast enum instances nested within JSON or array database columns using Eloquent Attribute accessors and mutators.