reinink / advanced-eloquent by reinink

A set of advanced Eloquent macros for Laravel
382,749
579
17
Package Data
Maintainer Username: reinink
Maintainer Contact: jonathan@reinink.ca (Jonathan Reinink)
Package Create Date: 2018-11-22
Package Last Update: 2020-07-07
Language: PHP
License: MIT
Last Refreshed: 2024-12-15 15:00:17
Package Statistics
Total Downloads: 382,749
Monthly Downloads: 4,072
Daily Downloads: 8
Total Stars: 579
Total Watchers: 17
Total Forks: 26
Total Open Issues: 1

Advanced Eloquent

A set of advanced Eloquent macros for Laravel.

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)

  • $column must be a string.
  • $query must either be an instance of Illuminate\Database\Query\Builder or Illuminate\Database\Eloquent\Builder.

orderBySub($query, $direction = 'asc', $nullPosition = null)

  • $query must either be an instance of Illuminate\Database\Query\Builder or Illuminate\Database\Eloquent\Builder.
  • $direction must either be 'asc' or 'desc'.
  • $nullPosition must either be null, 'first' or 'last'.

orderBySubAsc($query, $nullPosition = null)

  • $query must either be an instance of Illuminate\Database\Query\Builder or Illuminate\Database\Eloquent\Builder.
  • $nullPosition must either be null, 'first' or 'last'.

orderBySubDesc($query, $nullPosition = null)

  • $query must either be an instance of Illuminate\Database\Query\Builder or Illuminate\Database\Eloquent\Builder.
  • $nullPosition must either be null, '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();