reinink / advanced-eloquent
A set of advanced Eloquent macros for Laravel
Installs: 436 238
Dependents: 1
Suggesters: 0
Security: 0
Stars: 577
Watchers: 13
Forks: 25
Open Issues: 1
pkg:composer/reinink/advanced-eloquent
This package is auto-updated.
Last update: 2025-04-07 10:45:07 UTC
README
A set of advanced Eloquent macros for Laravel.
⚠️ Note, I've brought much of the functionality provided by this package to Laravel core, in particular the subquery functionality, which has pretty much made this package obsolete. If you want to learn more about these features, be sure to see my Eloquent Peformance Patterns course, which covers these techniques and others in detail.
Installation
You can install this package via Composer:
composer require reinink/advanced-eloquent
This package uses auto-discovery, so there is no further configuration required.
API
addSubSelect($column, $query)
$columnmust be a string.$querymust either be an instance ofIlluminate\Database\Query\BuilderorIlluminate\Database\Eloquent\Builder.
orderBySub($query, $direction = 'asc', $nullPosition = null)
$querymust either be an instance ofIlluminate\Database\Query\BuilderorIlluminate\Database\Eloquent\Builder.$directionmust either be'asc'or'desc'.$nullPositionmust either benull,'first'or'last'.
orderBySubAsc($query, $nullPosition = null)
$querymust either be an instance ofIlluminate\Database\Query\BuilderorIlluminate\Database\Eloquent\Builder.$nullPositionmust either benull,'first'or'last'.
orderBySubDesc($query, $nullPosition = null)
$querymust either be an instance ofIlluminate\Database\Query\BuilderorIlluminate\Database\Eloquent\Builder.$nullPositionmust either benull,'first'or'last'.
Note: Null positions (NULLS FIRST and NULLS LAST) are not supported by all databases (ie. MySQL and SQLite), but are supported by PostgreSQL and others.
Examples
Get a user's last login date using a subquery:
$users = User::addSubSelect('last_login_at', Login::select('created_at') ->whereColumn('user_id', 'users.id') ->latest() )->get();
Same example as above, except using the query builder instead:
$users = DB::table('users')->addSubSelect('last_login_at', DB::table('logins') ->select('created_at') ->whereColumn('user_id', 'users.id') ->latest() )->get()
Order users by their company name using a subquery:
$users = User::orderBySub(Company::select('name')->whereColumn('company_id', 'companies.id'))->get();
Order users by their last login date, with null values last:
$users = User::addSubSelect('last_login_at', Login::select('created_at') ->whereColumn('user_id', 'users.id') ->latest() )->orderBySubDesc(Login::select('created_at') ->whereColumn('user_id', 'users.id') ->latest(), 'last' )->get();