Laravel: usando o ORM Eloquent
O que é um ORM?
Do inglês (Object Relational Mapper), ORM é uma técnica de desenvolvimento de software que serve para o uso de tabelas de bancos de dados em formato de objetos relacionais, facilitando assim a manutenção de dados. Usando esta técnica o programador não precisa se preocupar em escrever códigos na linguagem SQL, pois a listagem e persistência é toda feita pela interface do ORM. Alguns exemplos são: Hibernate, usado para a linguagem Java; Sequelize, usado para Node.js; entre outros.
Eloquent
O framework Laravel, usado para desenvolver software com a linguagem PHP, conta com uma série de ferramentas para facilitar o trabalho do programador. Uma dessas ferramentas é o Eloquent ORM, que faz com que a interação com o banco de dados se torne mais fácil e elegante.
Usando esta ferramenta você pode usar:
- Funções básicas de CRUD;
- Relacionamentos um-para-um;
- Relacionamentos um-para-vários;
- Relacionamentos vários-para-vários;
- e Relacionamentos polimórficos.
Como o Eloquent trabalha?
O Eloquent provê um Active Record Pattern, ou seja um padrão de registro ativo, que transforma a sua tabela ou view do banco de dados em uma classe do PHP. Este tipo é ideal para uma estrutura MVC, onde a classe criada pelo ORM é chamada de Model ou modelo.
O model Usuario, por exemplo, vai corresponder à tabela usuario no seu banco de dados, e é a instancia direta para a tabela em uma estrutura MVC. Por exemplo, se você deseja listar todos os registros dessa tabela, você deve usar: Usuario::all(). Veja alguns exemplos:
Descrição | Função |
Lista todos os usuários | Usuario::all() |
Encontra um registro específico | Usuario::find(id) |
Apagar um registro | Usuario::delete(id) |
Aplicação exemplo
[button color=”black” size=”normal” alignment=”none” rel=”follow” openin=”newwindow” url=”https://github.com/ClubeDosGeeksCoding/eloquent”]GitHub[/button]
Faremos uma aplicação para cadastro de Perfil e Usuario onde haverão relações de um-para-um e de um-para-vários.
Um perfil pode ter vários usuários, e um usuário pode ter apenas um perfil. Eu posso listar usuários com o perfil, ou listar os perfis com seus usuários.
Se você é novo em Laravel, sugiro que leia estes tutoriais primeiro:
- API RESTful PHP com Laravel
- Laravel + AngularJS – Sua primeira aplicação
- Laravel + AngularJS – Upload de arquivos
Iniciando Aplicação Laravel
Você pode usar o instalador do Larvel, executando o seguinte comando no bash:
$ composer global require “laravel/installer”
O Laravel será instalado de forma global. Depois você pode iniciar um aplicativo Laravel com o seguinte comando:
$ laravel new exemplo
Lembrando que exemplo será o nome da pasta de sua aplicação.
Criando projeto com composer
Você pode usar o comando create-project do composer, que é a alternativa mais indicada para usuários Windows. Veja como fazer:
$ composer create-project laravel/laravel exemplo --prefer-dist
Será criada a pasta exemplo e dentro dela uma série de pastas e arquivos do Laravel. As principais pastas que iremos usar serão app e config.
Configurando o Virtual Host
Você precisa configurar um virtual host para apontar para a pasta da sua aplicação de exemplo. Farei este exemplo usando WAMP instalado obviamente em um computador com sistema operacional Windows.
Arquivos hosts
Primeiro abra o arquivo hosts do Windows, que está em C:\Windows\System32\drivers\etc e adicione o seguinte no final:
127.0.0.1 laravel.exemplo
laravel.exemplo será o domínio para acessar nossa api.
Virtual host
Se você estiver usando Windows e WAMP o arquivo de virtual hosts estará emC:\wamp\bin\apache\apache2.4.17\conf\extra, tenha atenção à versão do apache.
Adicione o seguinte no arquivo:
<VirtualHost *:80> DocumentRoot "CAMINHO_PARA_PASTA_DA_API" ServerName laravel.exemplo </VirtualHost>
Você deve colocar o caminho da sua API apontando para a pasta public, por exemplo: C:/wamp/www/exemplo/public
Acesse o endereço laravel.exemplo no seu navegador. Você verá a tela de demonstração do Laravel.
Lembrando a configuração do Virtual Hosts pode ser diferente em determinados sistemas operacionais.
Banco de dados
Crie um banco de dados com o nome exemplo_eloquent.
CREATE DATABASE exemplo_eloquent;
Configuração
Abra o arquivo database.php que está dentro da pasta config da sua aplicação Laravel, e você verá um vetor com diversas chaves, uma delas será a connections onde você vai encontrar exemplos de conexões de bancos de dados SQLite, MySQL e PostgreSQL. Usaremos MySQL, então modifique as configurações para o seguinte:
'mysql' => [ 'driver' => 'mysql', 'host' => 'localhost', 'port' => '3306', 'database' => 'exemplo_eloquent', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, 'engine' => null, ],
Migrations
O Laravel conta com um sistema para migração de bancos de dados, para facilitar a mudança de servidor ou tipo de banco de dados se ela for precisa. E também é ótimo para quem trabalha com código compartilhado.
Para criar uma migration precisamos usar o seguinte comando:
$ php artisan make:migration Perfil –create=perfil
Os arquivos de migração serão criados na pasta database/migrations, o nome de cada um deles será composto pela data e hora atual mais o termo informado, como Perfil por exemplo, e ele terá extensão .php.
Abra esse arquivo e veja que ele é basicamente uma classe que conta com dois métodos (up e down) sem conteúdo algum dentro deles.
Migration Perfil
Adicionaremos o seguinte código dentro do método up() do arquivo referente a Perfil:
Schema::create('perfil', function (Blueprint $table) { $table->increments('id'); $table->char('nome',200); $table->timestamps(); });
Migration Usuario
Execute o comando:
$ php artisan make:migration Usuario –create=usuario
Schema::create('usuario', function (Blueprint $table) { $table->increments('id'); $table->integer('perfil_id'); $table->char('nome',200); $table->char('email',200); $table->timestamps(); });
Migrando
Para completar a migração execute:
$ php artisan migrate
Note que no seu banco de dados serão criadas as tabelas perfil, usuario e migrations.
Eloquent models
Agora, já com o banco de dados migrado, faremos os nossos modelos. Os models devem ficar na pasta app, mas podem ser criados com linha de comando também.
Perfil
Para criar o model execute o seguinte comando:
$ php artisan make:model Perfil
Deixaremos o arquivo app/Perfil.php da seguinte maneira:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Perfil extends Model { protected $table = 'perfil'; // Aqui está o relacionamento esntre perfil e usuario public function usuarios(){ return $this->hasMany('App\Usuario'); } }
Note dentro da function usuarios que usamos uma relação de um-para-vários (hasMany) para o model Usuario.
Usuario
Criamos o model Usuario com o seguinte comando:
$ php artisan make:model Usuario
E deixaremos o arquivo app/Usuario.php da seguinte maneira:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Usuario extends Model { protected $table = 'usuario'; // Declarando relação public function perfil(){ return $this->hasOne('App\Perfil','id'); } }
Note que dentro da function perfil fazemos uma relação de um-para-um com o model Perfil que foi criado anteriormente.
Usando Eloquent na inserção de dados
Faremos a inserção de dados através de Seeders. Na pasta database/seeds você vai encontrar o arquivo DatabaseSeeder, edite ele para que fique da seguinte forma:
<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // Inserindo Perfis $perfil = \App\Perfil::create(['nome' => "Administrador"]); $perfil2 = \App\Perfil::create(['nome' => "Autor"]); // Inserindo usuários $usuario1 = \App\Usuario::create([ 'nome' => str_random(10), 'perfil_id'=>$perfil->id ]); $usuario2 = \App\Usuario::create([ 'nome' => str_random(10), 'perfil_id'=>$perfil->id ]); $usuario3 = \App\Usuario::create([ 'nome' => str_random(10), 'perfil_id'=>$perfil2->id ]); } }
Agora execute o comando:
$ php artisan db:seed
Os dados serão inseridos no seu banco de dados.
No exemplo acima usamos apenas um arquivo seeder, mas podemos usar vários outros para facilitar o trabalho, você só precisa chama-los na função run() de DatabaseSeeder.php
Usando Eloquent para buscar dados
Abra o arquivo app/Http/routes.php, que contem as rotas da nossa aplicação.
Adicione as seguintes rotas a ele:
// Todos os perfis Route::get('/perfis',function(){ return \App\Perfil::with('usuarios')->get(); }); // Um perfil específico Route::get('/perfil/{id_perfil}',function($id_perfil){ return \App\Perfil::with('usuarios')->get()->find($id_perfil); }); // Todos os usuários Route::get('/usuarios',function(){ return \App\Usuario::with('perfil')->get(); }); // Um usuário específico Route::get('/usuario/{id_usuario}',function($id_usuario){ return \App\Usuario::with('perfil')->get()->find($id_usuario); });
Agora abra um navegador de sua preferência e digite os seguintes endereços:
URL | Função |
laravel.exemplo/perfis | Lista todos os perfis com usuários |
laravel.exemplo/perfil/1 | Mostra apenas o perfil de id 1 com usuários |
laravel.exemplo/usuarios | Lista todos os usuários com seu respectivo perfil |
laravel.exemplo/usuario/1 | Lista o usuário de id 1 com seu respectivo perfil |
Concluindo
Existem outras várias funções e relacionamentos que o Eloquent fornece, mas isso é coisa para outros tutoriais.
Veja o código fonte deste exemplo no GitHub
Very good your content congratulations
Eu quero criar algo assim http://www.bling.com.br
minha dúvida é qual framework utilizar e como vou fazer para criar essas sessions onde cada usuário tem um acesso ao banco de dados, futuramente vou criar um aplicativo de celular para que a pessoa acesse via web e mobile.
Gosto do PHP porém não sei se começo com codeigniter ou laravel (laravel precisa de servidor grande)
Muito bom! Obrigada!
Executei exatamente conforme o tutorial e o retorno dos usuários está errado, ele está apontando para o id dos perfis então quando chega no terceiro usuário dá null.
O modelo certo seria assim:
public function perfil(){
return $this->hasOne(‘App\Perfil’, ‘id’, ‘perfil_id’);
}
Aonde posso encontrar as referências do que você escreveu (é para colocar no meu tcc mesmo)?
Pra um tcc melhor você procurar por artigos científicos que falem sobre isso. Mas tudo que foi usado no texto pode ser encontrado no site do laravel: laravel.com