Relacionamento de entidade com Doctrine é um recurso poderoso e que facilita e muito nosso trabalho com a manipulação de entidades.
Este post é uma continuação do Aprenda a construir um CRUD simples, fácil e rápido com Doctrine onde sua leitura é fundamental, pois é a base para este post.
Em nosso projeto temos todo o CRUD de produtos implementado, porem é natural que um produto seje ligado a uma categoria.
Para que possamos construir esse vinculo “relacionamento” devemos criar a entidade Category em “src\Category.php“.
|
|
Vamos descrever em detalhes a implementação utilizada na entidade.
- class Category
- @Entity
- Responsável por informar ao doctrine que a classe é uma entidade.
- @Table(name=”categorys”)
- Informamos que a entidade representa a tabela ‘categorys’ no banco de dados.
- @Entity
Gerando o banco de dados
Após a criação da entidade, devemos executar o seguinte comando no terminal para a criação do banco de dados:
|
|
Como retorno, será exibido uma mensagem similar ao demonstrado abaixo:
|
|
Cadastrando categorias
Para que seja possível vincular um produto a uma categoria, antes devemos cadastrar no banco de dados as categorias que desejamos.
Segue abaixo a estrutura que será utilizada para persistir as informações no banco de dados.
|
|
Como podemos observar, a forma como foi construído o processo é simples e bem descritiva.
Primeiro recebemos o nome desejado, para que em seguida seja instanciado nossa Entidade Category, informamos os dados e inserimos no banco de dados.
Para podemos validar o código, vamos cadastrar nossa primeira categoria. Para tal ação basta inserir o seguinte comando no terminal:
|
|
Como resultado teremos nossa primeira categoria cadastrada!
|
|
Alterando a entidade produtos para receber uma categoria
Criamos a entidade Category, cadastramos nossa primeira categoria, porem agora devemos criar o vinculo ao qual desejamos entre Produto e Categoria.
Abra a entidade Products em “src\Products.php” e vamos implementar nossas alterações desejadas.
|
|
As novidades que encontramos em nossa entidade é o atributo category e os métodos setCategory() e getCategory(), vamos analisar suas implementações:
- private $category;
- @ManyToOne(targetEntity=”Category”)
- Com essa annontation, informamos ao Doctrine que desejamos criar um relacionamento muitos para um, vinculando a entidade Category.
- @ManyToOne(targetEntity=”Category”)
- public function setCategory($category)
- Método responsável por inserir a categoria na entidade Products.
- public function getCategory()
- Método responsável por retornar a categoria do produto.
Após as devidas implementações finalizadas, devemos implementar as novas estruturas no processo de cadastro de produto “Insert“, para isso abra o arquivo CreateProduct.php em “scr/CreateProduct.php” e implemente as seguintes modificações.
|
|
A base da estrutura de insert de produtos continua a mesma, o diferencial encontra-se em receber o id da categoria desejada, pesquisar seus dados no banco de dados e caso seja encontrado inserimos no objeto Products para seu devido cadastro no banco.
Vamos cadastrar nosso primeiro produto, para isso insira o seguinte comando no terminal:
|
|
Como retorno teremos nosso primeiro produto cadastrado e vinculado a uma categoria 🙂
|
|
Caso seja realizado a tentativa de cadastro com um categoria inexistente, será retornado a mensagem:
|
|
Viram como foi simples as implementações para criarmos uma estrutura de entidades interligadas e realizar os cadastro de ambos 🙂
Pesquisando produtos
Podemos realizar a pesquisa de produtos cadastrados, e para nossa felicidade não temos que mudar em nada a estrutura contida no arquivo ListProduct.php encontrado em “src/ListProduct.php” pois a estrutura de pesquisa permanece a mesma, porem vamos apenas alterar a forma de exibição dos dados no terminal, para melhor exibição dos dados.
|
|
Como podemos observar, o objeto product acessa seu método getCategory() que por sua vez tem acesso ao objeto que fornece acesso ao método getName() implementado na classe Category.
O Doctrine retorna uma classe Proxy que nos fornece acesso a classe Category, a partir disso o atributo fornece acesso a qualquer método implementado em category, respeitando_ assim a estrutura OO de nossas classes._
O exemplo descrito no post é simples, pois tem o intuito de ser direto e produtivo, o Dotrine tem um leque de opções para trabalhar com os diversos tipos de relacionamentos de entidade.
Espero que tenha apreciado o conteúdo e que também agregue valor aos seus projetos, lembrando que uma boa arquitetura da camada de modelo construída com Doctrine tonar mais simples sua manutenção, e caso encontre necessário o porte para outros frameworks ou estruturas, tudo será mais simples e com menos dores de cabeça e acredite quando eu lhe digo que você apreciará de ter esse fardo tirado da suas costas.
Dicas, sugestões, criticas ou elogios recomento que deixem nos comentários, para que assim possamos compartilhar ainda mais conhecimento.
Grande abraço e até a próxima! 🙂