LaravelPackages.net
Acme Inc.
Toggle sidebar
linx/repository

Repository Pattern for Eloquent

18
0
About linx/repository

linx/repository is a Laravel package for repository pattern for eloquent. It currently has 0 GitHub stars and 18 downloads on Packagist. Install it with composer require linx/repository. Discover more Laravel packages by linx or browse all Laravel packages to compare alternatives.

Last updated

Repository Pattern For Eloquent

Repository Pattern for Laravel Eloquent ORM. Not need Laravel for use.

Install

With Composer: composer install janez89/repository

Usage

  • Common Usage
  • Laravel 5
  • Lumen
  • Without Framework

Common Usage

Sample Author model:

<?php

// Author Model
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class Author extends Model
{
    protected $table = 'authors';
	
	// not necessary ...
    protected $guarded = ['id'];
    protected $casts = [
        'id' => 'int'
    ];

    public function posts()
    {
        return $this->hasMany(Post::class, 'author_id');
    }
}

Sample AuthorRepository:

<?php
// Author Repository
namespace App\Repositories;

use Janez89\Repository\AbstractEloquentRepository;
use App\Models\Author;

class AuthorRepository extends AbstractEloquentRepository
{
    public function getModelClass()
    {
        return Author::class;
    }
}

Using the Repository (with API example):

<?php
// ...
use App\Repositories\AuthorRepository;

class AuthorController extends Controller
{
	protected $repository;
	public function __construct(AuthorRepository $repository)
	{
		$this->repository = $repository;
	}

	public function index(Request $request)
	{
		return $this->repository->paginate($request->get('page'));
	}

	public function show($id)
	{
		return $this->repository->find($id);
		// if model not found then thrown ModelNotFoundException
	}
	
	public function store(Request $request)
	{
		// validation here ...
		return $this->repository->create($request->all());
	}

	public function update(Request $request, $id)
	{
		// validation here ...
		
		$model = $this->repository->find($id);
		$model->fill($request->all());
		$model->save();
		// OR
		$this->repository->save($model);
		return $model;
		
		// Custom soulution
		$this->repository->update($request->all(), $id);
		return $this->repository->find($id);
	}
	
	public function destroy($id)
	{
		$this->repository->delete($id);
	}
}

Helper Traits:

####Transactional Helper:

<?php
// Author Repository
namespace App\Repositories;

use Janez89\Repository\AbstractEloquentRepository;
use Janez89\Repository\Traits\EloquentTransactional;
use App\Models\Author;

class AuthorRepository extends AbstractEloquentRepository
{
	use EloquentTransactional;  // <-- here

    public function getModelClass()
    {
        return Author::class;
    }
}

Transaction example:

// ...
$repository = new AuthorRepository();

$result = $repository->transaction(function () use ($repository, $request) {
	return $repository->create($request->all());
});

// OR
try {
	$repository->beginTransaction();
	// operations ...
	$repository->commit();
} catch (\Exception $e) {
	$repository->rollback();
}

####DataTable Helper

The DataTable helper provide data for http://datatables.net/

<?php
// Author Repository
namespace App\Repositories;

use Janez89\Repository\AbstractEloquentRepository;
use Janez89\Repository\Traits\DataTables;
use App\Models\Author;

class AuthorRepository extends AbstractEloquentRepository
{
	use DataTables;  // <-- here

    public function getModelClass()
    {
        return Author::class;
    }
}

DataTable Example:

<?php
// ...
use App\Repositories\AuthorRepository;

class AuthorController extends Controller
{
	protected $repository;
	public function __construct(AuthorRepository $repository)
	{
		$this->repository = $repository;
	}
	
	public function index()
	{
		return view('author.index');
	}

	public function getData(Request $request)
	{
		return $this->repository->dataTable($request);
	}
	// ...
}

DataTable View example:

@extends("layouts.main")
@section('content')
<table id="example" class="display" cellspacing="0" width="100%">
        <thead>
            <tr>
                <th>Name</th>
                <th>Created At</th>
                <th>Updated At</th>
            </tr>
        </thead>
    </table>

<script>
$(document).ready(function() {
    $('#example').DataTable( {
        "processing": true,
        "serverSide": true,
        "ajax": "/authors/data"
    } );
} );
</script>
@endsection
Comments