Eager Load Relations of Morphed Models in Laravel 5.8.22
Published on by Paul Redmond
The Laravel team released v5.8.22 yesterday with a new morphWith
method to eager load relationships of morphed models. This release is packed with new features so be sure to check out the full release notes and a few notes about some of the new features below.
First, a new @componentFirst
directive was added, which is similar to how @includeFirst
works:
<div> @componentFirst(['missing/file', 'found/file']) @slot('title', 'Test Component') @endcomponent</div>
Next, a new withMorph
method was added when you want to load relations of morphed models eagerly:
$comments = Comment::query() ->with(['commentable' => function (MorphTo $morphTo) { $morphTo->morphWith([Post::class => ['user']]); }]) ->get();
I would recommend checking out Pull Request #28647 for a better understanding of how this works. One benefit of this approach is that nested relationships are supported by using with
(as seen in the above example).
Next, a new containsAll
method was added to the Str
utility class which determines if a given string contains all array values:
// trueStr::containsAll('taylor otwell', ['taylor', 'otwell']); // falseStr::containsAll('taylor otwell', ['taylor', 'xxx']);
Next, error handling for maintenance mode commands was introduced which now outputs a failed message and an exit code of 1
if either up or down commands fail.
Next, the TestResponse::assertJsonValidationErrors
method now has message value assertions which enables you to check both error keys and messages:
$response->assertJsonValidationErrors([ 'key' => 'validation message']);
The JSON validation errors message still allows index arrays which will assert a matching key, and a mix of both indexed array values and associative arrays of key and message values.
This assertion also accepts an array of messages:
$response->assertJsonValidationErrors([ 'key' => ['validation message', 'another validation message'],]);
I also wanted to give a massive shout-out to Tetiana Blindaruk for handling the changelog and releases for Laravel. It’s not an easy job to consolidate all the merged pull requests and commits and format them into a clean changelog. Thank you, Tetiana!
You can see the full list of fixes below, and the whole diff between 5.8.21 and 5.8.22 on GitHub. The full release notes for Laravel 5.8 are available in the GitHub 5.8 changelog:
v5.8.22
Added
- Added
@componentFirst
directive (#28783) - Added support for typed eager loads (#28647, d72e3cd)
- Added
Related
andRecommended
to Pluralizer (#28749) - Added
Str::containsAll()
method (#28806) - Added: error handling for maintenance mode commands (#28765, 9e20849)
- Added message value assertion to
TestResponse::assertJsonValidationErrors()
(#28787) - Added: Automatically bind the viewAny method to the index controller action (#28820)
Fixed
- Fixed database rules with where clauses (#28748)
- Fixed: MorphTo Relation ignores parent $timestamp when touching (#28670)
- Fixed: Sql Server issue during
dropAllTables
when foreign key constraints exist (#28750, #28770) - Fixed
Model::getConnectionName()
whenModel::cursor()
used (#28804)