Uma boa prática de programação para ajudar a desacoplar o máximo possível o nosso código e não ficar dependendo sempre de um único tipo de ORM é usar o Repository, no Laravel existe um repository muito bom criado pelo Anderson Andrade:

https://github.com/andersao/l5-repository

Para fazer a instalação usando o composer é bem simples, como de costume:

[code]composer require prettus/l5-repository[/code]

Após a instalação, devemos configurar o Laravel, adicionando o Provider dentro de config/app.php:

[code]
‘providers’ => [

Prettus\Repository\Providers\RepositoryServiceProvider::class,
],[/code]

Após adicionar o provider, vamos publicar as alterações com o artisan:
[code]php artisan vendor:publish[/code]

Agora, dentro da pasta config podemos encontrar o arquivo repository.php, no final desse arquivo podemos configurar o generator, precisamos fazer isso para funcionar de acordo com a nomeclatura da nossa aplicação, exemplo:
[code]
‘generator’ => [
‘basePath’ => app_path(),
‘rootNamespace’ => ‘NameSpaceDaNossaAplicacao\\’,
‘paths’ => [
‘models’ => ‘Models’, // Pasta onde será criado os models
‘repositories’ => ‘Repositories’, // Pasta onde será criado nossos repositories
‘interfaces’ => ‘Repositories’,
‘transformers’ => ‘Transformers’,
‘presenters’ => ‘Presenters’,
‘validators’ => ‘Validators’,
]
]
[/code]

Configurando os nossos Models
Agora que o Laravel está configurado, temos que criar nossos Repositories que serão a representação do nosso Model, para isso, um novo comando foi adicionado ao artisan, o make:repository, vamos criar o model e repository de Category por exemplo:
[code]php artisan make:repository Category[/code]
Você vai ver que dentro da pasta app/Repositories, foi criado o nosso repositório e na pasta onde você configurou para receber o Model, foi criado o model.

Agora para fazer um teste de funcionamento, vamos abrir o nosso arquivo de rotas e criar um exemplo:
[code]
Route::get("/teste", function(){
$categories = $app->make("AppNameSpace\Repositories\CategoryRepositoryEloquent");
return $categories->all();
})
[/code]

Esse código vai listar todas as categorias e criar e retornar no formato JSON, mas do jeito que está, nos continuamos com o acoplamento, pois no momento em que instanciamos o CategoryRepositoryEloquent, nos estamos programando para uma aplicação direta do Eloquent, se quisermos mudar para o Doctrine por exemplo, teremos que mudar em todo código e isso é péssimo, continuamos com um grande acoplamento, para mudar nessa estrutura, vamos usar um Service Provider.

Podemos criar nosso Service Provider usando o Artisan:
[code]
php artisan make:provider RepositoryServiceProvider
[/code]

Após rodar esse comando, nosso service provider foi criado dentro da pasta app/Providers, agora vamos registrar a informação que queremos chamar o CategoryRepositoryEloquent quando instanciamos o CategoryRepository que é uma interface, mas como não podemos instanciar uma interface, nos fazemos esse registro no service provider:

[code]
public function register(){

$this->app->bind(‘AppNameSpace\Repositories\CategoryRepository’,
‘AppNameSpace\Repositories\CategoryRepositoryEloquent’,
);
}

[/code]

Com isso, instamos informando para o Laravel que sempre que instanciarmos o CatetoryRepository, na verdade nos estamos instanciando o CategoryRepositoryEloquent, quando quisermos mudar para outro ORM, alteramos apenas nesse local.
Agora precisamos registrar nosso Provider no config/app.php, dentro do array de registro dos Providers usados na nossa aplicação.

Pronto, agora nosso código de testes fica:
[code]
Route::get("/teste", function(){
$categories = $app->make("AppNameSpace\Repositories\CategoryRepository");
return $categories->all();
})
[/code]