* fix: respect table prefixes in query builder relationship aggregates
* fix: preserve one-of-many relationship semantics in query builder aggregates
* fix: respect relationship method constraints in query builder aggregates
Aggregate subqueries were built from a fresh query on the related model,
so constraints defined inside the relationship method itself were never
applied. An aggregate over a relationship such as
`hasMany(Post::class)->where('is_published', true)` silently aggregated
every related row, and `wherePivot()` on a `BelongsToMany` was ignored
in the same way.
Merge the relationship's own query into the subquery with
`mergeConstraintsFrom()`, matching how Laravel builds its own
`withAggregate()` subqueries.
---------
Co-authored-by: Dan Harrin <git@danharrin.com>
UiAvatarsProvider::get() takes the first character of each
space-separated word in the user's name with no filtering, so a name
starting with a bracket (a common convention for marking service or
system accounts, e.g. "[SYSTEM] Admin") leaks that bracket into the
initials: "[A" instead of "SA".
Fixes#20384
`ReflectionMethod::setAccessible()` is deprecated as of PHP 8.5, and has had no
effect since PHP 8.1 - reflection ignores visibility on its own, so `invoke()`
still reaches the protected methods of a mixin. Calling it only raised a
deprecation notice on 8.5, so the call is removed.
Claude-Session: https://claude.ai/code/session_015vxpe34oAqmDtzZxC8HSV2
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* feat: add missing Khmer translations for the view record page and chart widget.
* chore: update the missing Khmer language translations for multi-factor authentication and form components
* chore: update Khmer language translations for validation and email verification controller
* fix: fallback to default GITHUB_TOKEN if GH_ACCESS_TOKEN is not defined in workflow checkout
* feat: add and update Khmer language translations for various components and packages
Completes all missing sw translations across 13 packages (694 keys in 50 files), removes stale keys, and fixes existing strings: untranslated rich editor link tool, duplicated h1/h2 headings, key_value row labels using the wrong noun, pagination overview pluralization, and terminology alignment (Hariri for edit actions).
* fix: Cache used MFA codes using hash of secret rather than secret and code
* support non-locking drivers
* consistency
* fix: return an array from `SpatieTagsEntry`/`SpatieTagsColumn` `getState()` when state is not a Collection or array
The early-return branch returned the raw state from a method typed `array`,
which threw a `TypeError` for any truthy scalar state. PHPStan 2.2.8 narrows
`mixed` more precisely and surfaced this, failing CI on every branch.
The early-return branch returned the raw state from a method typed `array`,
which threw a `TypeError` for any truthy scalar state. PHPStan 2.2.8 narrows
`mixed` more precisely and surfaced this, failing CI on every branch.
* fix: derive per-key state path when unsetting missing array keys in tests
`unsetMissingNumericArrayKeys()` appended `.{$key}` to `$currentStatePath`
inside its `foreach`, so each sibling key inherited the preceding keys'
segments instead of deriving `parent.key` per key.
Walking `$this->mountedActions`, the entry's keys are ordered `name`,
`arguments`, `context`, `data`, so by the time the loop reaches `data` the
path has become:
mountedActions.0.name.arguments.context.data
The `startsWith($schemaStatePath)` guard then never matches
`mountedActions.0.data`, which leaves the `unset()` for stale numeric keys
unreachable. In a test, filling a mounted action's form with a shorter list
silently keeps the removed items:
// CheckboxList::make('roles'), mounted state ['viewer', 'creator']
->fillForm(['roles' => ['viewer']])
// state is still ['viewer', 'creator']
`callAction(..., data: [...])` and `setActionData()` route through
`fillForm()`, so they are affected too. Growing the list works, and clearing
it to `[]` works because an empty array stays a leaf for `Arr::dot()` and
`data_set()` replaces the whole value. Only a partial shrink breaks, and it
breaks silently: the assertion after it passes against state that was never
changed.
Page-level forms were unaffected, because their state path is the single
segment `data` and every corrupted path still starts with it.
* Update InteractsWithSchemasTest.php
---------
Co-authored-by: Dan Harrin <git@danharrin.com>