Jump to content
edivancastro

Mapeamento com doctrine ORM

Recommended Posts

Pessoal, em anexo segue meu modelo de banco de dados (duas tabelas). Estou utilizando doctrine. Este é um modelo resumido para eu tentar explicar o que estou passando.

 

As minhas classes Banner e Menu extendem de classes diferentes (ClasseX e ClasseY) e estas classes Banner e Menu, como voces podem ver possuem um Link que pode ser para uma categoria, artigo ou linkexterno (http://outrosite.com). Dai surgiu essa necessidade de min criar uma classe Link. Porem na minha opiniao é inviavel eu criar uma tabela no banco de dados para armazenar link, ou seja, a classe link não chega ser uma entidade concreta (tabela), seria apenas coluna no BD e para cada tipo de Link há uma estrategia para gerar o seu respectivo LinkURL, conforme pode ser observado na classe Link.

 

Pensei em fazer class Menu extends Link   e  class Banner extends Link, porem as classes banner e menu ja extendem de outras classes e como o PHP não aceita herança multipla não tem como.

 

enfim, como faço para mapear a classe Link para este modelo de banco de dados meu?

 

 

 

<?php

/**
* @ORM\Entity
*/
class Banner extends ClasseX{
	/**
	* @ORM\Id
	*/
	private $id;
	
	/**
	* @ORM\Column('type=string')
	*/
	private $descricao;
	
	private $link;

	protected setLink(Link $link){
		$this->link = $link;
	}

	protected getLink(){
		return $this->link;
	}
}

 

 

 

<?php

/**
* @ORM\Entity
*/
class Menu extends ClasseY{
	/**
	* @ORM\Id
	*/
	protected $id;

	/**
	* @ORM\Column(type="string")
	*/
	protected $descricao;

	protected $link;

	protected setLink(Link $link){
		$this->link = $link;
	}

	protected getLink(){
		return $this->link;
	}
}

 

<?php

class Link{
	const TIPO_ARTIGO=1;
	const TIPO_CATEGORIA=2;
	const TIPO_LINKEXTERNO=3

	protected $tipo_link;
	protected $categoria;
	protected $artigo;
	proctected $linkexterno;

	public function setLink($link){
		if(is_object($link)){
			switch(get_class($link)){
				case Artigo::class:
				  $this->tipo = self::TIPO_ARTIGO;
				  $this->artigo = $link;	
				  break;
				case Categoria::class:
				  $this->tipo = self::TIPO_CATEGORIA;
				  $this->categoria = $link;
				  break;
			}
		}else{
			$this->tipo = self::TIPO_LINKEXTERNO;
			$this->linkexterno = $link;
		}
	}

	public function getLinkUrl(){
		switch($this->tipo_link){
			case self::TIPO_ARTIGO;
				return $this->makeUrlToArtigo();
				break;
			case self::TIPO_CATEGORIA;
				return $this->makeUrlToCategoria();
				break;
			case self::TIPO_LINKEXTERNO;
				return $this->linkexterno;
		}
	}

}

 

Sem título.png

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By gust.php
      Bom dia senhores.
       
      Estou tentando agrupar uma consulta por data no Doctrine se sucesso .... Alguém pode ajudar?
       

             $em = $this->getEntityManager();                $qb = $em->createQueryBuilder();         $qb->select('u');         $qb->from('Servico\Model\Servico', 'u');                  $qb->where('u.STATUS IN (:status)');         $qb->setParameter('status', ['2', '3', '4', '6']);         if ($cliente) {             $qb->andWhere('u.CLIENTE = :cliente');             $qb->setParameter('cliente', $cliente);         }         if ($fornecedor) {             $qb->andWhere('u.FORNECEDOR = :fornecedor');             $qb->setParameter('fornecedor', $fornecedor);         }         if ($motorista) {             $qb->andWhere('u.MOTORISTA = :motorista');             $qb->setParameter('motorista', $motorista);         }         if ($fileCliente) {             $qb->andWhere('u.FILE = :file_cliente');             $qb->setParameter('file_cliente', $fileCliente);         }         if ($inicio AND $fim) {             $qb->andWhere('u.DATA_INICIO BETWEEN :inicio AND :fim');             $qb->setParameter('inicio', $inicio);             $qb->setParameter('fim', $fim);         }         $qb->orderBy('u.DATA_INICIO', 'ASC');         $qb->addOrderBy('u.HORA_INICIO', 'ASC');         //$qb->groupBy('u.DATA_INICIO');                     ---> Isso não funciona         $query = $qb->getQuery();         return $query->getResult();
    • By gust.php
      Prezados, bom dia
       
      Estou com um problema serio, precisando da ajuda de vcs.
       
      É o seguinte, tenho um tabela grande que esta relacionada com várias outras tabelas, essas tabelas viraram entidades no sistema e faço esse relacionamento com doctrine. No sistema, tenho uma tela com vários filtros, período de data, cliente, numero e motorista, esses são os filtros.
       
      Esse filtro funciona assim: Se o usuário fizer uma busca pelo período, é retornado só aquele período, se ele coloco o motorista vem o período com o motorista, o mesmo com o numero e cliente.
       
      Ta acontecendo o seguinte. Quando eu faço a primeira busca, o resultado é retornado em segundos, muito rápido, na segunda busca, muito rápido, na terceira muito rápido, depois o sistema começa a ficar tão lento que a tela chega a travar, eu tenho que mudar de tela para o sistema voltar a responder.
       
      Alguém já passou por isso?
       
      Já andei pesquisando e cheguei a conclusão que o doctrine retorna todos os relacionamentos envolvidos, é muita coisa,  por isso que deve estar travando, falta memória. Já tentei usar o parâmetro EXTRA_LAZY nos relacionamentos, mesmo assim não funcionou.
       
      Alguém sugere alguma coisa?
    • By gust.php
      Olá galera...
       
      Acho que o meu problema é mais relacionado a OO que PHP.... Eu tenho a seguinte estrutura: Motorista, Veiculo e uma terceira tabela MOTORISTA_VEICULO que faz o relacionamento das 2 classes.
      Acredito que esta seja a maneira correta, pois nem todo motorista tem um carro relacionado. Meu problema esta aqui:
       
      Quando quero pegar uma informação do carro pelo motorista eu consigo:
       
      $motorista->getVeiculo()->getPlaca();    // OK, tenho a placa do carro
       
      Agora, se eu quiser pegar alguma informação do carro pelo motorista não funciona:
       
      $veiculo->getMotorista()->getNome();  // Fatal error: Call to undefined method Doctrine\ORM\PersistentCollection::getNome() in
       
      Minhas classe:
       
      MOTORISTA

      /**      * @ORM\ManyToMany(targetEntity="Veiculo", cascade={"merge"})      * @ORM\JoinTable(name="MOTORISTA_VEICULO",      *      joinColumns={@ORM\JoinColumn(name="MOTO_IDMOTORISTA", referencedColumnName="IDMOTORISTA")},      *      inverseJoinColumns={@ORM\JoinColumn(name="MOTO_IDVEICULO", referencedColumnName="IDCAR", unique=true)}      *  )      */     private $veiculo;             public function __construct()     {         parent::__construct();         $this->veiculo   = new \Doctrine\Common\Collections\ArrayCollection();     }     function getVeiculo()     {         return $this->veiculo;     }     function setVeiculo($veiculo)     {         $this->veiculo[] = $veiculo;     }
       
      VEICULO
       

      **      *      * @ORM\ManyToMany(targetEntity="Motorista", mappedBy="veiculo")      */     private $motorista;       function getMotorista() {         return $this->motorista;     }     function setMotorista($motorista)     {         $this->motorista = $motorista;     }     public function __construct()     {         $this->motorista = new \Doctrine\Common\Collections\ArrayCollection();     }
    • By Bruno Henrique da Costa
      Galera, estou com uma duvida em doctrine, será que alguem poderia me ajudar.
      Eu tenho 3 campos sendo (data exclusao, data alteração e data inclusão), porém eu tenho q trabalhar de uma forma dinamica com eles para não ficar remontando o código, eu estou usando o metodo eventos do doctrine sendo eles, preRemove, prePersist e preUpdate, sendo que o preRemove eu vou atualizar o campo data exclusão prePersist o campo de cadastro e o preUpdate o campo de alteração.
      Porem os campos inicio e alteração da entidade está dando certo, so que quando eu vou para o preRemove não está, ele esta duplicando o registro e isso não é o que eu gostaria, alguem poderia me ajudar?
      Segue abaixo o meu código do evento.
       
      <?php namespace User\Event; use Zend\ServiceManager\ServiceManager; use Zend\Authentication\AuthenticationServiceInterface; use User\Entity; class Events { protected static $TEMPO_UPDATE; private $sm; public function __construct(ServiceManager $sm){ $this->sm = $sm; } private function getUsuario(){ $authService = $this->sm->get(AuthenticationServiceInterface::class); if($authService->hasIdentity()){ return $authService->getIdentity(); } } public function preRemove($eventArgs){ $entity = $eventArgs->getEntity(); $em = $eventArgs->getEntityManager(); if (method_exists($entity, 'setDtExc')) { self::$TEMPO_UPDATE = $entity->getDtAlt(); $entity->setDtAlt(-1); $entity->setDtExc(TEMPO); $em->persist($entity); $em->flush($entity); $em->detach($entity); } if (method_exists($entity, 'setUsuario') && !$entity instanceof Entity\Usuario && !$entity instanceof Entity\UsuarioPermissao && !$entity instanceof Entity\Grupo && !$entity instanceof Entity\GrupoPermissao) { $entity->setUsuario($this->getUsuario()); } } public function prePersist($eventArgs) { $entity = $eventArgs->getEntity(); if (method_exists($entity, 'setDtIni')) { $entity->setDtIni(TEMPO); } if (method_exists($entity, 'setUsuario') && !$entity instanceof Entity\Usuario && !$entity instanceof Entity\UsuarioPermissao && !$entity instanceof Entity\Grupo && !$entity instanceof Entity\GrupoPermissao) { $entity->setUsuario($this->getUsuario()); } } public function preUpdate($eventArgs) { $entity = $eventArgs->getEntity(); if (method_exists($entity, 'setDtAlt')) { switch($entity->getDtAlt()){ case -1: $entity->setDtAlt(self::$TEMPO_UPDATE); break; default: $entity->setDtAlt(TEMPO); } } if (method_exists($entity, 'setUsuario') && !$entity instanceof Entity\Usuario && !$entity instanceof Entity\UsuarioPermissao && !$entity instanceof Entity\Grupo && !$entity instanceof Entity\GrupoPermissao) { $entity->setUsuario($this->getUsuario()); } } } ?>  
    • By claudiojuniorfabiao
      Fala, galera!
       
      Indo direto ao ponto, qual a diferença entre o padrão de software DAO e um ORM?
       
      Em minha ignorância, me parecem conceitos semelhantes, sendo o DAO simplesmente algo mais abstrato, então, de certa forma, me parece que todo ORM está implementando um DAO de qualquer maneira, uma vez que (sendo um DataMapper), separa a lógica de domínio, da lógica de acesso aos dados.
       
      Agradeço desde já a contribuição com os meus estudos.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.