terça-feira, 20 de novembro de 2012

Annotations no Doctrine - @Column

Nesse post vou falar um pouco sobre as Annotations no Doctrine buscando deixar essa página como guia de consulta rápida para vc escrever suas entidades ok?

O que vc precisa saber para entender esse artigo:
  • Lógica de programação
  • PHP
  • POO
  • ORM
  • Conhecer pelo menos o básico de Doctrine


Bem, o que são essas annotations? Para quem conhece Java sabe que é indiscutível a agilidade e facilidade de configuração que as annotations proporcionam, elas são formas de descrever toda uma classe através de comentários.

Com o objetivo de trazer tal comodidade ao PHP surgiu o projeto Addendum – escrito por Jan Suchal – que permite via Reflection acessar as annotations das classes.
As annotations devem ser escritas em blocos de comentários, uma vez que o @ (caracter que inicia uma annotation) é um caractere reservado no PHP. Elas podem ser mono ou multi valoradas de acordo com os exemplos abaixo.


  1. // Custom annotation  
  2. class Persistent extends Annotation {}  
  3. // Custom annotation  
  4. class Table extends Annotation {}  
  5. // Multi valued annotation  
  6. class Secured extends Annotation {  
  7.    public $role;  
  8.    public $level;  
  9. }  
  10. /**  
  11.  * @Persistent  
  12.  * @Table("people")
  13.  * @Secured(role = "admin", level = 2)
  14.  */  
  15. class Person {  
  16.    // some code  
  17. }  
  18. // getting the annotation by class name  
  19. $reflection = new ReflectionAnnotatedClass('Person');  
  20. // getting the annotation by instance  
  21. $person = new Person();  
  22. $reflection = new ReflectionAnnotatedClass($person);  
  23. // true  
  24. $reflection->hasAnnotation('Persistent');  
  25. // contains string "people"  
  26. $reflection->getAnnotation('Table')->value;


No doctrine usamos as annotations para descrever uma classe que representa uma entidade do sistema ou seja, uma tabela no banco, seguindo a mesma onda da JPA, facilitando a configuração das classes de persistência e seus relacionamentos.



  1. /**
  2.  * @DoctrineEntity(tableName="pessoa")
  3.  */  
  4. class Pessoa {  
  5.    /**
  6.     * @DoctrineId
  7.     * @DoctrineColumn(type="integer")
  8.     * @DoctrineIdGenerator("auto")
  9.     */  
  10.    public $id;  
  11.    /**
  12.     * @DoctrineColumn(type="varchar", length=255)
  13.     */  
  14.    public $nome;  
  15.    /**
  16.     * @DoctrineColumn(type="varchar")
  17.     */  
  18.    public $sobrenome;  
  19.    /**
  20.     * @DoctrineManyToOne(targetEntity="Usuario",
  21.            joinColumns={"user_id" = "id"})
  22.     */  
  23.    public $usuario;  
  24.    
  25. }



Vejam que acabamos de criar uma entidade pessoa onde apontamos os campos e os tipos dos campos, no ultimo uma outra entidade(usuario) montando o relacionamento ManyToOne.



Bem eu precisei dar essa parte básica do Doctrine para finalmente montarmos uma relação das annotations então, chega de enrolar.




Annotations Doctrine

@Column (O mais utilizado, e o mais básico)
Esse é o carinha que define a maioria das colunas que criamos dentro de nossas entidades, o proprio nome diz, é ele que marca um atributo como uma coluna válida no banco. Qualquer espera de valor dentro desta variável será salvo e carregado a partir do banco de dados como parte do ciclo de vida das variáveis ​​de instância da entidade de classe.



Atributos requeridos:
  • type: Tipo do atributo para que seja criado a coluna no banco baseado nesse tipo como por exemplo char, int etc...
Atributos opcionais:
  • name: Por padrão o nome do atributo é o nome da coluna no banco(sem o $ é claro), mas pe possível determinar um outro nome para a coluna utilizando o name.
  • length: Usado para tipo "string" serve para determinar o limite máximo de caracteres dessa coluna. O Doctrine não valida o tamanho da string no funcionamento do sistema, oque aconteceria era um funcionamento comum onde apenas o limite liberado é que seria gravado no banco de dados.
  • precision: Marca a precisão de números decimais(número exato) da coluna (Aplicado apenas para colunas decimais)
  • scale: The scale for a decimal (exact numeric) column (Applies only for decimal column)
  • unique: Valor booleano que determina se o valo é unico.
  • nullable: Determina se coluna pode ser NULL.
  • columnDefinition:  DDL SQL trecho que se inicia após o nome da coluna e especifica a definição de coluna completa (non-portable!). Este atributo permite fazer uso de recursos avançados RMDBS. No entanto, você deve fazer uso cuidadoso deste recurso tomando cuidado com as conseqüências. SchemaTool não irá detectar alterações na coluna mais correctamente se você usar "ColumnDefinition".
    Além disso, você deve se lembrar que o "type" ainda lida com a conversão entre PHP e os valores do banco de dados. Se você usar esse atributo em uma coluna que é usada para junções entre tabelas você também deve dar uma olhada em @ JoinColumn.


Exemplos simples:

  1. <?php
  2. namespace GuestBook\Model\Doctrine\Entity;
  3. /**
  4.  *
  5.  * @Table(name="guestbook")
  6.  * @Entity
  7.  */
  8. class GuestBookDoctrine{
  9.    
  10.     /**
  11.      * @var integer $id
  12.      * @Column(type="integer")
  13.      * @Id
  14.      * @GeneratedValue(strategy="IDENTITY")
  15.      */
  16.     private $id;
  17.    
  18.     public function setId($id){$this->id = $id;}
  19.     public function getId(){return $this->id;}
  20.    
  21.    
  22.     /**
  23.      * @Column(type="string", length="100")
  24.      */
  25.     private $title;
  26.     public function setTitle($title){$this->title=$title;}
  27.     public function getTitle(){return $this->title;}
  28.    
  29. }



Exemplo da documentação do doctrine:
<?php
/**
 * @Column(type="string", length=32, unique=true, nullable=false)
 */
protected $username;

/**
 * @Column(type="string", columnDefinition="CHAR(2) NOT NULL")
 */
protected $country;

/**
 * @Column(type="decimal", precision=2, scale=1)
 */
protected $height;




Bem acho que por hoje é só, até o próximo artigo sobre mais annotations do doctrine.


Um comentário: