Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/Illuminate/Database/Eloquent/Model.php
Original file line number Diff line number Diff line change
Expand Up @@ -2673,6 +2673,16 @@ protected static function resolveClassAttribute(string $attributeClass, ?string

return static::$classAttributes[$cacheKey] = $property ? $instance->{$property} : $instance;
}

foreach ($reflection->getTraits() as $trait) {
$attributes = $trait->getAttributes($attributeClass);

if (count($attributes) > 0) {
$instance = $attributes[0]->newInstance();

return static::$classAttributes[$cacheKey] = $property ? $instance->{$property} : $instance;
}
}
} while ($reflection = $reflection->getParentClass());
} catch (Exception) {
//
Expand Down
35 changes: 35 additions & 0 deletions tests/Database/DatabaseEloquentModelAttributesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,20 @@ public function test_trait_initializer_merges_fillable_with_attribute(): void

$this->assertEqualsCanonicalizing(['name', 'email', 'phone'], $model->getFillable());
}

public function test_trait_with_attribute_applies_to_class(): void
{
$model = new ModelUsingWithoutIncrementingTraitWithAttribute;

$this->assertFalse($model->getIncrementing());
}

public function test_class_attribute_takes_precedence_over_trait(): void
{
$model = new ModelOverridingTraitConnectionAttribute;

$this->assertSame('primary', $model->getConnectionName());
}
}

enum ConnectionUnitEnum
Expand Down Expand Up @@ -773,3 +787,24 @@ class ModelWithFillableAttributeAndTrait extends Model
{
use AddsPhoneFillable;
}

#[WithoutIncrementing]
trait TraitUsingWithoutIncrementingAttribute
{
}

class ModelUsingWithoutIncrementingTraitWithAttribute extends Model
{
use TraitUsingWithoutIncrementingAttribute;
}

#[Connection('secondary')]
trait TraitUsingConnectionAttribute
{
}

#[Connection('primary')]
class ModelOverridingTraitConnectionAttribute extends Model
{
use TraitUsingConnectionAttribute;
}