2012-03-02 13 views
5

Usando anotaciones es muy fácil de configurar un valor predeterminado para una columna dada e inicializar colecciones de relaciones de entidad:Valor de columna predeterminado con Doctrine2 y Symfony2 con YAML?

use Doctrine\Common\Collections\ArrayCollection; 

class Category 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="Product", mappedBy="category") 
    */ 
    protected $products; 

    /** 
    * @ORM\Column(type="bool") 
    */ 
    protected $is_visible; 

    public function __construct() 
    { 
     $this->products = new ArrayCollection(); 
     $this->is_visible = true; // Default value for column is_visible 
    } 
} 

cómo la misma se puede lograr usando YAML definición lugar, sin escribir manualmente Category.php? ¿Es __construct() el único método para hacer esto?

Acme\StoreBundle\Entity\Category: 
    type: entity 
    id: 
     id: 
      type: integer 
      generator: { strategy: AUTO } 
    fields: 
     is_visible: 
      type: bool 
    oneToMany: 
     products: 
      targetEntity: Product 
      mappedBy: category 

Respuesta

13

Creo que malinterpretaste las anotaciones de alguna manera porque el valor predeterminado se establece a través de php simple.

/** 
* @ORM\Column(type="bool") <- This is an annotation 
*/ 
protected $is_visible; 

public function __construct() 
{ 
    $this->products = new ArrayCollection(); // <- This is not an annotation 
    $this->is_visible = true; // <- This is not an annotation 
} 

No hay diferencia usando el mapeo YAML para el valor predeterminado. La razón es simple, aquí la forma en que la clase está mirando con anotaciones:

use Doctrine\Common\Collections\ArrayCollection; 

class Category 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="Product", mappedBy="category") 
    */ 
    protected $products; 

    /** 
    * @ORM\Column(type="bool") 
    */ 
    protected $is_visible; 

    public function __construct() 
    { 
     $this->products = new ArrayCollection(); 
     $this->is_visible = true; // Default value for column is_visible 
    } 
} 

Y así es como se ve con YAML mapeo:

use Doctrine\Common\Collections\ArrayCollection; 

class Category 
{ 
    protected $id; 
    protected $products; 
    protected $is_visible; 

    public function __construct() 
    { 
     $this->products = new ArrayCollection(); 
     $this->is_visible = true; // Default value for column is_visible 
    } 
} 

La diferencia en el segundo ejemplo es que no hay más anotaciones , ya que la asignación se realiza a través de YAML. La construcción de la clase se hace exactamente igual. Por lo tanto, los valores predeterminados se establecen en tiempo de construcción que se realiza en PHP sin formato.

No hay diferencia entre las anotaciones y el mapeo YAML para esta tarea. Entonces, en resumen, necesitas editar la clase PHP generada para poner tus valores predeterminados. No hay forma de que puedas configurarlo en YAML y dejar que Doctrina ponga este código para ti, al menos, en el momento en que hablamos.

Tal vez malinterpreté su pregunta :), si es el caso, no dude en corregirme.

Espero que ayude.

Saludos,
Matt

+0

La anotación de Nope fue clara para mí (tal vez mi inglés no es tan bueno para explicarlo bien). Pero confirmó lo que estoy diciendo: con YAML tiene que editar la clase PHP generada para establecer los valores predeterminados, ¿verdad? No hay otra manera de hacer esto? – gremo

+1

No hay forma de hacer esto con las anotaciones tampoco. Debe agregar manualmente el método de construcción y agregar el valor predeterminado. – Sgoettschkes

+0

Sí, como dijo y confirmó @Boo, debe poner su valor predeterminado en la clase PHP generada directamente. He editado mi respuesta para resaltar este hecho. – Matt

2

puede intentar añadir valor por defecto con columnDefinition, pero es DDL y que depende de DBMS específicos (malo). Siguiendo su ejemplo, el campo * * is_visible el uso de MySQL:

is_visible: 
    type: bool 
    columnDefinition: is_visible tinyint(1) NOT NULL DEFAULT '1' 

En general, esto es no es una buena idea y se le anima a utilizar el método constructor o inicialización de la propiedad por código dentro de la clase de entidad ..

11

Puede agregar el valor predeterminado para la columna usando la propiedad options en la anotación o yaml. Puede leer más en doctrine annotation documentation.

Ejemplo para la anotación:

/** 
* @ORM\Column(type="bool", name="is_visible", options={"default": false}) 
*/ 
protected $isVisible; 

Ejemplo para YAML: ha pasado

isVisible: 
    type: boolean 
    column: is_visible 
    options: 
     default: false 
+0

Gracias, parece la única respuesta válida si le preocupan las migraciones de la base de datos al agregar una nueva columna cuyo valor predeterminado debe establecerse para todos los objetos existentes. Establecer el valor en PHP solo funcionaría para objetos nuevos. – youen

1

El tiempo. Ahora puede establecer el valor predeterminado para una columna mediante yaml.

columnName: 
    type: string 
    options: 
      default: "someText" 
Cuestiones relacionadas