2017 © Pedro Peláez
 

library laravel-custom-relation

Create your own custom relation for when stock relations aren't enough

image

ardalanamini/laravel-custom-relation

Create your own custom relation for when stock relations aren't enough

  • Thursday, January 11, 2018
  • by ardalanamini
  • Repository
  • 1 Watchers
  • 1 Stars
  • 58 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 2 Forks
  • 0 Open issues
  • 5 Versions
  • 16 % Grown

The README.md

Laravel Custom Relation

Create your own custom relation for when stock relations aren't enough, (*1)

[TOC], (*2)

Use this if...

  • None of the stock Relations fit the bill. (BelongsToManyThrough, etc)

Installation

The recommended way to install is with composer:, (*3)

composer require ardalanamini/laravel-custom-relation

Example

Let's say we have 3 models:, (*4)

  • User
  • Role
  • Permission

Let's also say User has a many-to-many relation with Role, and Role has a many-to-many relation with Permission., (*5)

So their models might look something like this. (I kept them brief on purpose.), (*6)

class User {
    public function roles() {
        return $this->belongsToMany(Role::class);
    }
}
class Role {
    public function users() {
        return $this->belongsToMany(User::class);
    }

    public function permissions() {
        return $this->belongsToMany(Permission::class);
    }
}
class Permission {
    public function roles() {
        return $this->belongsToMany(Role::class);
    }
}

What if you wanted to get all the Permissions for a User, or all the Users with a particular Permission? There no stock Relation in Laravel to descibe this. What we need is a BelongsToManyThrough but no such thing exists in stock Laravel., (*7)

Solution

First, make sure your models are using the HasCustomRelations trait. Then, define custom relations like this., (*8)

use LaravelCustomRelation\HasCustomRelations;

class User {
    use HasCustomRelations;

    /**
     * Get the related permissions
     *
     * @return Illuminate\Database\Eloquent\Relations\Relation
     */
    public function permissions() {
        return $this->custom(
            Permission::class,

            // add constraints
            function ($relation) {
                $relation->getQuery()
                    // join the pivot table for permission and roles
                    ->join('permission_role', 'permission_role.permission_id', '=', 'permissions.id')
                    // join the pivot table for users and roles
                    ->join('role_user', 'role_user.role_id', '=', 'permission_role.role_id')
                    // for this user
                    ->where('role_user.user_id', $this->id);
            },

            // add eager constraints
            function ($relation, $models) {
                $relation->getQuery()->whereIn(
                  'role_user.user_id',
                  collect($models)->map(function ($value) {
                      return $value->getKey();
                  })->values()->unique()->sort()->all()
               );
            }
        );
    }
}
use LaravelCustomRelation\HasCustomRelations;

class Permission {
    use HasCustomRelations;

    /**
     * Get the related users
     *
     * @return Illuminate\Database\Eloquent\Relations\Relation
     */
    public function users() {
        return $this->custom(
            User::class,

            // constraints
            function ($relation) {
                $relation->getQuery()
                    // join the pivot table for users and roles
                    ->join('role_user', 'role_user.user_id', '=', 'users.id')
                    // join the pivot table for permission and roles
                    ->join('permission_role', 'permission_role.role_id', '=', 'role_user.role_id')
                    // for this permission
                    ->where('permission_role.permission_id', $this->id);
            },

            // eager constraints
            function ($relation, $models) {
                $relation->getQuery()->whereIn(
                    'permission_role.permission_id',
                    collect($models)->map(function ($value) {
                        return $value->getKey();
                    })->values()->unique()->sort()->all()
                );
            }
        );
    }
}

You could now do all the normal stuff for relations without having to query in-between relations first., (*9)

The Versions

11/01 2018

dev-master

9999999-dev https://github.com/ardalanamini/laravel-custom-relation

Create your own custom relation for when stock relations aren't enough

  Sources   Download

MIT

The Requires

 

laravel eloquent custom relationship relation

09/01 2018

v0.1.3

0.1.3.0 https://github.com/ardalanamini/laravel-custom-relation

Create your own custom relation for when stock relations aren't enough

  Sources   Download

MIT

The Requires

 

laravel eloquent custom relationship relation

09/01 2018

v0.1.2

0.1.2.0 https://github.com/ardalanamini/laravel-custom-relation

Create your own custom relation for when stock relations aren't enough

  Sources   Download

MIT

The Requires

 

laravel eloquent custom relationship relation

03/01 2018

v0.1.1

0.1.1.0 https://github.com/ardalanamini/laravel-custom-relation

Create your own custom relation for when stock relations aren't enough

  Sources   Download

MIT

The Requires

 

laravel eloquent custom relationship relation

03/01 2018

v0.1.0

0.1.0.0 https://github.com/ardalanamini/laravel-custom-relation

Create your own custom relation for when stock relations aren't enough

  Sources   Download

MIT

The Requires

 

laravel eloquent custom relationship relation