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 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:


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 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 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 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

Jayr Alencar

Doutorando em Ciências da Computação no Centro de Informática da Universidade Federal do Pernambuco (CIn - UFPE); Mestre pela mesma instituição; Formado em Análise e Desenvolvimento de Sistemas; Católico; Fã de O Senhor do Anéis.

Você pode gostar...

7 Resultados

  1. murilo alves disse:

    Very good your content congratulations

  2. Clebson disse:

    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)

  3. Letícia disse:

    Muito bom! Obrigada!

  4. Matheus Andrade disse:

    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.

  5. Tais disse:

    Aonde posso encontrar as referências do que você escreveu (é para colocar no meu tcc mesmo)?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *