A 30 line piece of script can finally provide a good solution for a repository pattern in Laravel apps. Link to Github page The problem Laravel provides a beautiful way to query your database through Eloquent, an Object Relational Mapping. The moment your project becomes larger there starts to rise a problem. The difference between entities and models start to become vague. Let me give you an example: We have two methods, one called and one called . findByName concatName ; \ \ \ ; { $table = ; { ->whereName($name) ->whereIsPublished( ) ->first(); } { ->attributes[ ] . . ->attributes[ ]; } } <?php namespace App use Illuminate Database Eloquent Model class Product extends Model /** * The table associated with the model. * * string */ @var protected 'products' /** * Find published product by name * string $name * Product */ @param @return public : function findByName (string $name) Product return $this 1 /** * Say we want to concat the name and a category name * string */ @return public : function concatName () string return $this 'name' ' - ' $this 'category_name' What we are actually doing here is mixing methods for retrieving (collections of) Products, with methods for instances of 1 Product. A much cleaner approach would be to separate them into 2 different classes. One for obtaining instances and collections of models and one for the model definition itself. You might call this the repository pattern. Splitting into 2 classes There are several libraries for Laravel to start using the repository pattern. One thing that’s a huge disadvantage to me is that you can’t use Eloquent functions on your repositories. Since Eloquent is a huge reason why I am using Laravel I still wanted to be able to use Eloquent on repositories for obtaining models. The solution I created a very simple piece of code which enables on your repositories. This way you can use the repository pattern in a way which is fun and keep your models and your repositories clean! A repository with the use of would look like this: all the features of Eloquent laravel-repositories \ ; \ \ ; \ ; \ \ \ ; { ; $model; { ->model = app(Product::class); } { this->whereIsPublished( ) ->whereSku($sku) ->first(); } } <?php namespace App Repositories use App Models Product use MrAtiebatie Repository use Illuminate Database Eloquent Model /** * Product repository */ class ProductRepository extends Model use Repository /** * The model being queried. * * \Illuminate\Database\Eloquent\Model */ @var protected /** * Constructor */ public function __construct () $this /** * Find published products by SKU * {int} $sku * {Product} */ @param @return public : function findBySku (int $sku) Product return 1 By the use of the Repository trait and the property, knows which model to query and where to use Eloquent and where to use your own repository methods. $model laravel-repositories With this definition of the repository we can now use it in our controllers, jobs, commands etc: $router->get( , { $productRepo->all()->dd(); $productRepo->findBySku( )->name; $productRepo->first()->category; }); <?php /** * In your routes/web.php */ '/' function (\App\Repositories\ProductRepository $productRepo) // Use any Eloquent feature directly // Use your custom repository methods echo 12345 // You can even query relations echo Link to Github page Go try it out and leave me some feedback for improvement! I’m currently working on Laravel Pigeon, a notification center for communicating with your users and debugging notifications. Sign up for early access!