Doctrine ORM

Integrando o Doctrine ORM e Laravel 5 [parte-1]

Fala galera, estou a um tempinho sem escrever nada, vida corrida, faculdade e tudo mais, porém trago a vocês hoje um breve tutorial de como integrar o Doctrine ao Laravel 5, vamos nessa!

O que é o Doctrine ?

Antes de mais nada gostaria de falar um pouco sobre o projeto Doctrine. O Doctrine é um conjunto de vários projetos para se trabalhar especificamente com banco de dados, sejam ele relacionais como o MySQL e PostgreSQL ou não relacionais como o MongoDB.

A grande vantagem de se usar suas bibliotecas é o ganho de abstração, facilmente você pode trocar entre bancos sem problema nenhum, e caso você use o Doctrine ORM, você pode recriar a estrutura do seu banco de dados a partir de suas classes mapeadas, e como de é de se esperar, você não precisará escrever diretamente nenhum comando SQL.

Por que usar o Doctrine no Laravel se já existe o Eloquent ?

Dado uma breve explicação do que é o Doctrine, e caso você já conheça ou trabalhe com o Laravel, provavelmente você vai se perguntar, por que diabos eu usaria o Doctrine se o Laravel vem com o Eloquent por padrão? Bem, para dizer a verdade tudo depende, no meu caso por exemplo um dos maiores motivos de usar o Doctrine inicialmente foi o suporte ao banco de dados Sybase, contudo, e com o tempo, percebi que o Doctrine estava muito mais avançado do que o Eloquent, o que não é de se estranhar já que o Doctrine é um conjunto de bibliotecas dedicadas para um único propósito, além de ser um projeto mais antigo que o próprio Laravel, e com uma gama muito maior de projetos que o utilizam, abaixo eu listo algumas poucas vantagens que eu identifiquei no Doctrine ORM especificamente:

  1. Suporte a um número maior de banco de dados relacionais e não relacionais
  2. Possibilita tornar um banco relacional, um banco orientado a objetos
  3. Cria uma portabilidade da estrutura do seu banco de dados através do mapeamento de classes
  4. Maior gama de projetos que o utilizam, exemplo: Symfony

Integrando no Laravel

Obs.: Não estarei aqui mostrando inicialmente grandes detalhes de como utilizar o Doctrine, mas para os interessados existe um tutorial no site do projeto disponível neste link.

Mãos na massa

Como de praxe vamos criar um novo projeto usando o composer, considerarei que você já o possui instalado, caso não, sugiro ver esse post, após tudo instalado, execute o seguinte comando:

    composer create-project laravel/laravel --prefer-dist tutorial-doctrine

Isto criará uma pasta chamada “tutorial-doctrine”, fará o download do Laravel e fará a instalação de suas dependências.

A seguir precisaremos adicionar a dependência do Doctrine ORM, para isso execute o comando abaixo no terminal, na pasta que acabou de ser criada.

    composer require doctrineorm ~2.5

Após o termino da instalação, crie um arquivo chamado “cli-config.php” na pasta raiz do projeto. Esse arquivo basicamente fará a configuração e possibilitará o acesso via console das funcionalidades do Doctrine. Depois disso copie o código abaixo para o arquivo:

Agora precisaremos criar um ServiceProvider, ou uma classe que dará acesso ao EntityManager do Doctrine, para isso execute o comando abaixo na raiz do projeto.

    php artisan make:provider DoctrineServiceProvider

Isto criará um novo arquivo em “app/Providers”, agora copie o código abaixo para o arquivo.

Obs.: O código está comentado e caso necessitem tirar alguma dúvida, por favor escrevam nos comentários estarei atendendo o quanto antes for possível.

Agora para testarmos vamos alterar o arquivo de configuração de conexão com banco de dados do Laravel em “configdatabase.php”. Basicamente precisamos alterar duas coisas: mudar o valor da posição “default” para “sqlite” e alterar o driver da posição “sqlite” na lista de conexões de “sqlite” para utilizar o “pdo_sqlite”, que é o driver do Doctrine para se trabalhar com o SQLite.

Por fim apenas execute o comando abaixo para criar o arquivo do banco de dados na pasta “storage”.

    touch storage/database.sqlite

Finalmente vamos rodar um comando do Doctrine para verificar se está tudo certo.

    vendorbindoctrine orm:validate-schema

Caso esteja tudo certo será impresso no terminal uma mensagem dizendo que está tudo OK.

Bem pessoal, essa foi um introdução da integração do Doctrine com o Laravel 5, aguardem os próximos posts, segam-nos nas redes e até a próxima o.

  • Marcelo Wanderley

    Achei bem interessante o POST.

    Eu tenho uma dúvida.

    Existe a possibilidade de inserir dados de uma só vez contendo relacionamento em um único objeto?

    Algo deste tipo.

    • Jonathan André Schweder

      Sim, por exemplo, $cidade e $estado, $cidade teria um atributo chamado ‘estado’, com os devidos métodos get e set, nesse caso você faria algo como:

      $estadoRepository = $entityManager->getRepository(‘Estado’);

      $cidadeRepository = $entityManager->getRepository(‘Cidade’);

      $estado = $estadoRepository->find(1);//retorna o estado com ‘id’ = 1

      $cidade->setEstado($estado);//seta o estado na cidade

      $cidadeRepository ->save($cidade);//salva em memória o objeto

      $entityManager->flush();//envia as alterações para o banco (obrigatório)

      realmente esse primeiro post foi mais para configurações, mostrarei mais disso nos próximos, em resumo, no código usando apenas o ORM, você sempre vai trabalhar apenas com objetos.

      • Marcelo Wanderley

        Legal.

        E se for assim como exemplo.

        Um questionário tem varias perguntas e cada pergunta tem vários opções do tipo(radio button)..

        Assim também tem como registrar utilizando um único objeto?

        Neste exemplo temos uma relação One-To-Many e Many-To-Many

  • Marcelo Wanderley

    Achei bem interessante o POST.

    Eu tenho uma dúvida.

    Existe a possibilidade de inserir dados de uma só vez contendo relacionamento em um único objeto?

    Algo deste tipo.

    • Jonathan André Schweder

      Sim, por exemplo, $cidade e $estado, $cidade teria um atributo chamado ‘estado’, com os devidos métodos get e set, nesse caso você faria algo como:

      $estadoRepository = $entityManager->getRepository(‘Estado’);

      $cidadeRepository = $entityManager->getRepository(‘Cidade’);

      $estado = $estadoRepository->find(1);//retorna o estado com ‘id’ = 1

      $cidade->setEstado($estado);//seta o estado na cidade

      $cidadeRepository ->save($cidade);//salva em memória o objeto

      $entityManager->flush();//envia as alterações para o banco (obrigatório)

      realmente esse primeiro post foi mais para configurações, mostrarei mais disso nos próximos, em resumo, no código usando apenas o ORM, você sempre vai trabalhar apenas com objetos.

      • Marcelo Wanderley

        Legal.

        E se for assim como exemplo.

        Um questionário tem varias perguntas e cada pergunta tem vários opções do tipo(radio button)..

        Assim também tem como registrar utilizando um único objeto?

        Neste exemplo temos uma relação One-To-Many e Many-To-Many

  • Marcelo Wanderley

    Achei bem interessante o POST.

    Eu tenho uma dúvida.

    Existe a possibilidade de inserir dados de uma só vez contendo relacionamento em um único objeto?

    Algo deste tipo.

    • Jonathan André Schweder

      Sim, por exemplo, $cidade e $estado, $cidade teria um atributo chamado ‘estado’, com os devidos métodos get e set, nesse caso você faria algo como:

      $estadoRepository = $entityManager->getRepository(‘Estado’);

      $cidadeRepository = $entityManager->getRepository(‘Cidade’);

      $estado = $estadoRepository->find(1);//retorna o estado com ‘id’ = 1

      $cidade->setEstado($estado);//seta o estado na cidade

      $cidadeRepository ->save($cidade);//salva em memória o objeto

      $entityManager->flush();//envia as alterações para o banco (obrigatório)

      realmente esse primeiro post foi mais para configurações, mostrarei mais disso nos próximos, em resumo, no código usando apenas o ORM, você sempre vai trabalhar apenas com objetos.

      • Marcelo Wanderley

        Legal.

        E se for assim como exemplo.

        Um questionário tem varias perguntas e cada pergunta tem vários opções do tipo(radio button)..

        Assim também tem como registrar utilizando um único objeto?

        Neste exemplo temos uma relação One-To-Many e Many-To-Many

  • José Bernardes

    Estou estudando por conta própria banco de dados e achei bem interessante a matéria.
    Estou acompanhando.
    Valeu!!

  • José Bernardes

    Estou estudando por conta própria banco de dados e achei bem interessante a matéria.
    Estou acompanhando.
    Valeu!!

  • José Bernardes

    Estou estudando por conta própria banco de dados e achei bem interessante a matéria.
    Estou acompanhando.
    Valeu!!

  • Clientes Clientes

    Boa Tarde! Ótimo POST.
    Uma pergunta, É possível trabalhar com Multitenancy Separado por banco com Doctrine ?
    Caso afirmativo, você tem algum artigo sobre isso?

    Obrigado

    • Jonathan Schweder

      Olá, infelizmente não conheço muito de multi tenant, porém até onde pesquisei é perfeitamente possível, mudando apenas os parâmetros de conexão do Doctrine.

  • Clientes Clientes

    Boa Tarde! Ótimo POST.
    Uma pergunta, É possível trabalhar com Multitenancy Separado por banco com Doctrine ?
    Caso afirmativo, você tem algum artigo sobre isso?

    Obrigado

    • Jonathan Schweder

      Olá, infelizmente não conheço muito de multi tenant, porém até onde pesquisei é perfeitamente possível, mudando apenas os parâmetros de conexão do Doctrine.

  • Clientes Clientes

    Boa Tarde! Ótimo POST.
    Uma pergunta, É possível trabalhar com Multitenancy Separado por banco com Doctrine ?
    Caso afirmativo, você tem algum artigo sobre isso?

    Obrigado

    • Jonathan Schweder

      Olá, infelizmente não conheço muito de multi tenant, porém até onde pesquisei é perfeitamente possível, mudando apenas os parâmetros de conexão do Doctrine.

  • Esteves Klein

    Parabens, excelente post.
    Qual a previsão de publicar a continuação?
    Abs

  • Esteves Klein

    Parabens, excelente post.
    Qual a previsão de publicar a continuação?
    Abs

  • Esteves Klein

    Parabens, excelente post.
    Qual a previsão de publicar a continuação?
    Abs

  • Andre Felipe Joriatti

    Olá, parabéns pelo post, ficou muito bom. Fiquei com uma dúvida porém, como faço para conseguir uma instancia do entitymanager em outros lugares no laravel, por exemplo, dentro de um controller?

    Obrigado!

  • Andre Felipe Joriatti

    Olá, parabéns pelo post, ficou muito bom. Fiquei com uma dúvida porém, como faço para conseguir uma instancia do entitymanager em outros lugares no laravel, por exemplo, dentro de um controller?

    Obrigado!

  • Andre Felipe Joriatti

    Olá, parabéns pelo post, ficou muito bom. Fiquei com uma dúvida porém, como faço para conseguir uma instancia do entitymanager em outros lugares no laravel, por exemplo, dentro de um controller?

    Obrigado!

  • José Nicodemos Maia Neto

    Opa, parabéns pelo post.

    Apenas por curiosidade, existe um projeto que faz a integração do Laravel com Doctrine.
    Se quiser saber mais o link é http://laraveldoctrine.org/

    Abs.

  • José Nicodemos Maia Neto

    Opa, parabéns pelo post.

    Apenas por curiosidade, existe um projeto que faz a integração do Laravel com Doctrine.
    Se quiser saber mais o link é http://laraveldoctrine.org/

    Abs.

  • José Nicodemos Maia Neto

    Opa, parabéns pelo post.

    Apenas por curiosidade, existe um projeto que faz a integração do Laravel com Doctrine.
    Se quiser saber mais o link é http://laraveldoctrine.org/

    Abs.