News

New Features for Querying Polymorphic Relations in Laravel 5.8.27

Published
New Features for Querying Polymorphic Relations in Laravel 5.8.27 image

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 of has(), 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 use app.mix_url config (#28952)
  • Added RedisManager::setDriver() method (#28985)
  • Added whereHasMorph() and corresponding methods to work with MorphTo relations (#28928)

Fixed

Changed

  • Prevented TestResponse::dump() and TestResponse::dumpHeaders() methods from ending execution of the script (#28960)
  • Allowed TestResponse::dump() and TestResponse::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:: with static:: in the Relation::getMorphedModel() (#28974)
  • Set a message for SuspiciousOperationException (#29000)
  • Storing Mailgun Message-ID in the headers after sending (#28994)
Paul Redmond photo

Staff writer at Laravel News. Full stack web developer and author.

Filed in

Sponsored

serpapi logo
SerpApi

The Web Search API for Your LLM and AI Applications

Visit SerpApi

The latest

View all →
Securing Filament plugins with Plumb image

Securing Filament plugins with Plumb

Read article
LayaPHP: Self-Hosted Text Classification for PHP and Laravel image

LayaPHP: Self-Hosted Text Classification for PHP and Laravel

Read article
WhenMounted and BigInt Props in Inertia.js v3.8 image

WhenMounted and BigInt Props in Inertia.js v3.8

Read article
Postcodes for Laravel: GB Postcode Lookup and Geography Data image

Postcodes for Laravel: GB Postcode Lookup and Geography Data

Read article
Laravel 14 Adds a defaults() Method to Eloquent Models image

Laravel 14 Adds a defaults() Method to Eloquent Models

Read article
Laravel AI SDK and Laravel MCP Security Fixes: Update Now image

Laravel AI SDK and Laravel MCP Security Fixes: Update Now

Read article