New Features for Querying Polymorphic Relations in Laravel 5.8.27
Published on by Paul Redmond
The Laravel team released v5.8.27 with a whereHasMorph()
method to work with polymorphic Eloquent relationships (MorphTo
).
The new whereHasMorph()
and corresponding methods make it possible to query polymorphic relationships with something like the following:
Comment::whereHasMorph('commentable', [Post::class, Video::class], function ($query) { $query->where('title', 'foo');})->get();
Which produces something like the following query:
select * from "comments"where ( ( "commentable_type" = 'App\Post' and exists ( select * from "posts" where "comments"."commentable_id" = "posts"."id" and "title" = 'foo' ) ) or ( "commentable_type" = 'App\Video' and exists ( select * from "videos" where "comments"."commentable_id" = "videos"."id" and "title" = 'foo' ) ))
All the examples shown here are from the pull request (#28928) description, which explains it in further detail, so check out the full notes:
By creating a temporary
BelongsTo
relationship for each type and allowing relationship instances as the first argument ofhas()
, we can reuse most of the existing code.
The type is passed as the second argument to the closure, which simplifies queries with different constraints:
Comment::whereHasMorph('commentable', [Post::class, Video::class], function ($query, $type) { if ($type === Post::class) { // $query-> } if ($type === Video::class) { // $query-> }});
Last, providing a wildcard as the second argument will let Laravel get the possible types from the database:
Comment::whereHasMorph('commentable', '*', function ($query) { $query->where('title', 'foo');})->get();
Next, the mix asset URL is configurable via the MIX_ASSET_URL
environment variable.
Next, you can set the RedisManager
default driver with the setDriver()
method.
You can see the full list of fixes below, and the whole diff between 5.8.26 and 5.8.27 on GitHub. The full release notes for Laravel 5.8 are available in the GitHub 5.8 changelog:
v5.8.27
Added
- Let
mix
helper useapp.mix_url
config (#28952) - Added
RedisManager::setDriver()
method (#28985) - Added
whereHasMorph()
and corresponding methods to work withMorphTo
relations (#28928)
Fixed
- Fixed: Changing a database field to binary include
collation
(#28975) - Fixed app.stub for jquery components loading (#29001)
- Fixed equivalent for greek letter theta in
Str::ascii()
(#28999)
Changed
- Prevented
TestResponse::dump()
andTestResponse::dumpHeaders()
methods from ending execution of the script (#28960) - Allowed
TestResponse::dump()
andTestResponse::dumpHeaders()
methods chaining (#28967) - Allowed to
NotificationFake
accept custom channels (#28969) - Replace contents of service manifest atomically (#28973)
- Pass down the
serverVersion
database connection option to Doctrine DBAL connection (#28964, 1b55b28) - Replace
self::
withstatic::
in theRelation::getMorphedModel()
(#28974) - Set a message for
SuspiciousOperationException
(#29000) - Storing Mailgun Message-ID in the headers after sending (#28994)