Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Leandro Gomes da Silva

Doctrine com PHP puro, estou fazendo certo?

Recommended Posts

Boa tarde pessoal. Estou estudando a possibilidade de utilizar ORM em um projeto na faculdade (Propel, Doctrine ou PHP-ActiveRecord) e estou enfrentando alguns problemas com o Doctrine e o Propel (Vou abrir outro tópico essa semana sobre o Propel).

Primeiro, segue o código do que eu fiz através de vários tutoriais:

 

<?php

// entities/Album.php

use Doctrine\Common\Collections\ArrayCollection;

/**
*
* Description of Album
* @Table(name="albums")
*
**/
class Album
{
   /**
    * @var integer
    * @Id @Column(name="id", type="integer", nullabe=false)
    * @GeneratedValue(strategy="AUTO")
    **/
   private $id;
   /** @Column(type="string") **/
   private $type;
   /** @Column(type="string") **/
   private $title;
   /**
    * @param \Doctrine\Common\Collections\ArrayCollection $property
    * @OneToMany(targetEntity="Musics",mappedBy="album", cascade={"persist", "remove"})
    **/
   protected $musics;

   public function __construct()
   {
       $this->musics = new \Doctrine\Common\Collections\ArrayCollection();
   }

   public function getId()
   {
       return $this->id;
   }

   public function getType()
   {
       return $this->type;
   }

   public function setType($type)
   {
       $this->type = $type;
   }

   public function getTitle()
   {
       return $this->title;
   }

   public function setTitle($title)
   {
       $this->title = $title;
   }

   public function setMusics($musics)
   {
       $this->musics = $musics;
       return $this->musics;
   }

   public function getMusics()
   {
       return $this->musics;
   }

   public function hasMusics(Music $music)
   {
       $musics = array();

       foreach($this->getMusics() as $arrMember)
       {
           $musics[] = $arrMember->getMusicName();
       }

       if(in_array($music->getMusicName(), $musics)
       {
           return true;
       }
   }

   public function removeMusic(Music $music)
   {
       $this->musics->removeElemente($music);
       $music->unsetAlbum();
   }

   public function addMusic(Music $music)
   {
       $music->setUser($this);
       $this->musics[] = $music;
   }

}

?>

 

<?php

// entities/Music.php

/**
* @Table(name="musics")
* @Entity
*/
class Music
{
   /**
    * @var integer
    * @Id @column(name="id", type="integer", nullable=false)
    * @GeneratedValue(strategy="AUTO")
    */
   private $id;
   /**
    * @var Album
    * @ManyToOne(targetEntity="Album", inversedBy="musics")
    * @JoinColumns({
    *  @JoinColumn(name="album_id", referencedColumnName="id")
    * })
    */
   protected $album_id;
   /**
    * @var string
    * @Column(type="string")
    */
   protected $title;

   public function setAlbum(Album $album)
   {
       $this->album_id = $album;
   }

   public function unsetAlbum()
   {
       $this->album_id = null;
   }    

   public function getAlbum()
   {
       return $this->album_id;
   }


   public function getTitle()
   {
       return $this->title;
   }

   public function setTitle($title)
   {
       $this->title = $title;
       return $this->title;
   }

}

?>

 

Explicando o sistema:

Estou tentando fazer um SIMPLES sistema para cadastro de acervo musical (apenas para testar o framework), onde eu posso cadastrar albuns e músicas (Um album contém várias músicas).

 

O que eu estou em dúvida é se o que foi feito até agora está correto e COMO eu coloco isso pra funcionar! Deu um nó na minha cabeça e não consigo colocar isso pra rodar.

 

Espero ter sido claro, qualquer coisa me perguntem.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites
O que eu estou em dúvida é se o que foi feito até agora está correto e COMO eu coloco isso pra funcionar! Deu um nó na minha cabeça e não consigo colocar isso pra rodar.

 

Certo... Mas qual é o seu problema? Você está rodando e não funcionou... Quer saber somente se o código está em sua melhor forma... o quê?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah.... continuo não te entendendo. Tais querendo dizer como colocar isso na web? Se sim, você precisa do Doctrine instalado e um servidor Apache. Era isso que você queria? oO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah.... continuo não te entendendo. Tais querendo dizer como colocar isso na web? Se sim, você precisa do Doctrine instalado e um servidor Apache. Era isso que você queria? oO

 

Não... Eu tenho o doctrine instalado via PEAR no meu servidor local (ubuntu) e quero simplesmente testar esse código, realizar as operações de CRUD para ver se isso que eu fiz funciona. Inserir alguma coisa no banco de dados, remover...

 

Eu tinha pensado em criar um arquivo index.php (o nome não importa), e nesse arquivo chamar os métodos. Mas não vejo sentido nisso, já que estou usando Doctrine...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não... Eu tenho o doctrine instalado via PEAR no meu servidor local (ubuntu) e quero simplesmente testar esse código, realizar as operações de CRUD para ver se isso que eu fiz funciona. Inserir alguma coisa no banco de dados, remover...

 

Eu tinha pensado em criar um arquivo index.php (o nome não importa), e nesse arquivo chamar os métodos. Mas não vejo sentido nisso, já que estou usando Doctrine...

 

1. A modelagem está incorreta :)

 

2. Doctrine é apenas o mapeador. Você fará a interação entre os objetos normalmente.

 

3. Para salvar no BD, você usa o EntityManager. http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

1. A modelagem está incorreta :)

 

2. Doctrine é apenas o mapeador. Você fará a interação entre os objetos normalmente.

 

3. Para salvar no BD, você usa o EntityManager. http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html

 

 

Malditos tutoriais ¬¬ kkkkkk

 

Alguma dica sobre como fazer o mapeamento? Sei que com o Symfony posso gerar esses códigos através da linha de comando mapeando o banco de dados. Teria como fazer isso usando o php puro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

[...]posso gerar esses códigos através da linha de comando mapeando o banco de dados. Teria como fazer isso usando o php puro?

 

Engenharia reversa.

 

http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/tools.html#reverse-engineering

 

Apenas atente à nota colocada na documentação

 

Reverse Engineering is a one-time process that can get you started with a project. Converting an existing database schema into mapping files only detects about 70-80% of the necessary mapping information. Additionally the detection from an existing database cannot detect inverse associations, inheritance types, entities with foreign keys as primary keys and many of the semantical operations on associations such as cascade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora que me falaram que a modelagem está errada, estou penando para consertar... os tutoriais do Doctrine não estão ajudando :/

 

Encontrei um tutorial bacana aqui http://www.fonini.net/blog/tutorial-doctrine-de-instalacao-e-configuracao-do-2-2 mas eestou com problema na hora de gerar o SQL para criar o banco... quando rodo o comando "$ php doctrine orm:schema-tool:create --dump-sql" ele me retorna

[invalidArgumentException]

The helper "em" is not defined.

 

 

 

orm:schema-tool:create [--dump-sql]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Encontrei um tutorial bacana aqui http://www.fonini.net/blog/tutorial-doctrine-de-instalacao-e-configuracao-do-2-2 mas eestou com problema na hora de gerar o SQL para criar o banco... quando rodo o comando "$ php doctrine orm:schema-tool:create --dump-sql" ele me retorna

[invalidArgumentException]

The helper "em" is not defined.

 

 

 

orm:schema-tool:create [--dump-sql]

 

O doctrine não conseguiu carregar o EntityManager. Verifique se o Doctrine está em um diretório que pode ser incluído pelo php.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O doctrine não conseguiu carregar o EntityManager. Verifique se o Doctrine está em um diretório que pode ser incluído pelo php.

 

Como assim? Meu projeto está organizado assim:

 

Projeto

|

|->bin

|->Doctrine

|->entities

 

Eu apenas fiz o download dos arquivos do Doctrine e criei a pasta entities dentro, assim como diz no tutorial...

 

Resolvi alterar o nome de um arquivo (config-cli.php) para cli-config.php pq vi em algum lugar utilizando assim.. e não é que funcionou?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.