SHARE
TWEET

Untitled

a guest Apr 21st, 2017 51 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use Illuminate\Database\Eloquent\Model;
  6. use Illuminate\Database\Eloquent\Relations\BelongsToMany;
  7. use Illuminate\Database\Eloquent\Relations\HasMany;
  8.  
  9. /**
  10.  * Class BaseModel
  11.  * @package App
  12.  */
  13. abstract class BaseModel extends Model
  14. {
  15.     /**
  16.      * @param $query
  17.      * @param $relationName
  18.      * @param string $alias
  19.      */
  20.     public function scopeIncludeCount($query, $relationName, $alias = null)
  21.     {
  22.         $alias = $alias ?: $relationName . 'Count';
  23.  
  24.         $relation = call_user_func([$this, $relationName]);
  25.  
  26.         /**
  27.          * @var HasMany|BelongsToMany $relation
  28.          */
  29.         $relation->getRelated()->getTable();
  30.         $related = $relation->getRelated();
  31.  
  32.         if ($relation instanceof HasMany) {
  33.             $relationTable = $related->getTable();
  34.             $query
  35.                 ->leftJoin($relationTable, $relation->getForeignKey(), '=', $relation->getQualifiedParentKeyName())
  36.                 ->groupBy($this->getTable() . '.' . $this->primaryKey)
  37.                 ->addSelect([
  38.                     $this->getTable() . '.*',
  39.                     \DB::raw(sprintf('COUNT(DISTINCT %s.%s) as %s', $related->getTable(), $related->primaryKey, $alias))]
  40.                 );
  41.         } else {
  42.             $relationTable = $relation->getTable();
  43.             $query
  44.                 ->leftJoin($relationTable, $relation->getForeignKey(), '=', $relation->getQualifiedParentKeyName())
  45.                 ->groupBy($relation->getQualifiedParentKeyName())
  46.                 ->addSelect([
  47.                         $this->getTable() . '.*',
  48.                         \DB::raw(sprintf('COUNT(DISTINCT %s) as %s', $relation->getOtherKey(), $alias))
  49.                     ]
  50.                 );
  51.         }
  52.  
  53.     }
  54. }
RAW Paste Data
Top