Skip to content

[13.x] Fix resolveClassAttribute() cache key omitting the property - #60815

Merged
taylorotwell merged 1 commit into
laravel:13.xfrom
lazerg:fix/resolve-class-attribute-cache-key
Jul 16, 2026
Merged

taylorotwell merged 1 commit into
laravel:13.xfrom
lazerg:fix/resolve-class-attribute-cache-key

Conversation

@lazerg

@lazerg lazerg commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

resolveClassAttribute() leaves $property out of its cache key, so the object form and the property form of the same attribute share one cache slot. For #[Table] this collides initializeModelAttributes(), which caches the Table object, with isIgnoringTouch(), which caches the timestamps bool, so whichever runs first for a given model wins and #[Table(timestamps: false)] is silently ignored: the model is either still touched by its relations, or loses its table name and timestamps altogether, depending on call order. Adding $property to the key keeps the two forms apart.

Fixes #60803

@taylorotwell
taylorotwell merged commit 3480cdb into laravel:13.x Jul 16, 2026
55 checks passed
binaryfire added a commit to hypervel/components-backup that referenced this pull request Oct 1, 2026
Port refreshForUpdate with the shared refresh query path, upstream unit and integration coverage, and usage documentation. Preserve model key validation and relationship reload behavior.

Make relationship touching honor WithoutTimestamps and the same property/attribute precedence as model initialization. Disabled models could otherwise write updated_at, including on tables without that column. Strengthen the precedence cases and reconcile both attribute cache-order tests against the existing instance-based cache.

Complete the missing multi-attribute touch model test and documentation. Use the upstream keyed AsPivot lookup in the moved refresh helper; the rest of the trait lookup PR remains under reconciliation.

Upstream: laravel/framework at 01d008c9b5f32cb7c5e50a9a22273113d810b2a2.

laravel/framework#61247
laravel/framework#59175
laravel/framework#61073
laravel/framework#60815
laravel/framework#59457

Validation: timestamp precedence regressions failed before the correction and pass afterward; SQLite relation touching verifies inherited disabling. Changed test files, affected Eloquent ParaTest, full source/type analysis, and scoped formatting pass. Refresh integration tests also pass after the final trait lookup correction.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

resolveClassAttribute() cache key omits $property, so #[Table(timestamps:)] collides with isIgnoringTouch()

2 participants