Skip to content

zedisdog/laravel-repository

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

88 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

laravel repository

License

laravel repositories is used to abstract the data layer, making our application more flexible to maintain.

bad english

will be tested soon.

language

中文

feature

  • yii expands: you can append expands=xxx,xx to url for extra fields by call the relation methods
  • filters: you can append filters[fieldName]=xxx&filters[fieldName2]=xx to url for search records by given condition.
  • custom filters: you can add or cover the filter methods.
  • sort: you can append sorts[name]=asc to url for sort records by given field.
  • custom filters: you can add or cover the sort methods.

install

composer require dezsidog/laravel-repository

usage

create model

namespace App;

class Post extends Eloquent {

    protected $fillable = [
        'title',
        'author',
        ...
     ];

     ...
}

create repository

namespace App\Repository;

use Dezsidog\Repository;
use App\Post;

class PostRepository extends Repository {
    protected $model = Post::class;
}

add repository to controller

namespace App\Http\Controllers;

use App\Repository\PostRepository;

class PostsController extends BaseController {

    /**
     * @var PostRepository
     */
    protected $posts;

    public function __construct(PostRepository $repository){
        $this->posts = $repository;
    }
}

then you can

public function someMethod(){
    $this->posts->find(...);
    $this->posts->findBy(...);
    $this->posts->all();
    $this->posts->paginate(...); // deprecated
    $this->posts->create(...);
    $this->posts->update(...);
    $this->posts->delete(...);
}

expands

if model has relations.

namespace App;

use App\User;
use App\Type;

class Post extends Eloquent {

    protected $fillable = [
        'title',
        'author',
        'user_id',
        'type_id',
        ...
     ];

    public function user(){
        return $this->belongTo(User::class);
    }
    
    public function type(){
        return $this->belongTo(Type::class);
    }
     ...
}

you can

  • just append expands field to url:
https://www.xxxx.com/path/to/post-list?expands=user,type
  • or make expands auto
namespace App\Repository;

use Dezsidog\Repository;
use App\Post;

class PostRepository extends Repository {
    protected $model = Post::class;
    protected $expands = [
        'user',
        'type',
    ];
}

filters

to search something by

https://www.xxxx.com/path/to/post-list?filters[type_id]=3&filters[user_id]=1

you can use relations

https://www.xxxx.com/path/to/post-list?filters[type.id]=3&filters[user.id]=1

custom filters

add method named filterBy + key name, to custom filters.

namespace App\Repository;

use Dezsidog\Repository;
use App\Post;
use Illuminate\Database\Eloquent\Builder;

class PostRepository extends Repository {
    protected $model = Post::class;
    
    public function filterByNameOrTypeName(Builder $query, $value){
        $query->leftJoin('users', 'users.id', '=', 'posts.user_id')
            ->leftJoin('types', 'type.id', '=', 'posts.type_id')
            ->where(function(Builder $query) use ($value) {
                $query->where('users.username', 'like', '%'.$value.'%')
                    ->orWhere('types.name', 'like', '%'.$value.'%')
            });
    }
}

then make url:

https://www.xxxx.com/path/to/post-list?filters[name-or-type-name]=x

you can just cover the exists field

namespace App\Repository;

use Dezsidog\Repository;
use App\Post;
use Illuminate\Database\Eloquent\Builder;

class PostRepository extends Repository {
    protected $model = Post::class;
    
    public function filterByTitle(Builder $query, $value){
        $query->where('posts.title', '=', $value);
    }
}

sort

to sort something by

https://www.xxxx.com/path/to/post-list?sorts[type_id]=asc&sorts[user_id]=desc

you can not use relations

custom sorts

add method named sortBy + key name, to custom sorts.

namespace App\Repository;

use Dezsidog\Repository;
use App\Post;
use Illuminate\Database\Eloquent\Builder;

class PostRepository extends Repository {
    protected $model = Post::class;
    
    public function sortByName(Builder $query, $value){
        $query->orderby('name',$value);
    }
}

then make url:

https://www.xxxx.com/path/to/post-list?filters[name]=asc|desc

you can also cover the exists field

About

laravel repository

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages