使用YAML的Doctrine2和Symfony2的默认列值?

时间:2012-03-02 00:17:13

标签: symfony doctrine doctrine-orm

使用注释非常简单,可以为给定列设置默认值并初始化实体关系的集合:

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
    }
}

如果使用 YAML 定义,而不是手动编写Category.php,如何才能实现相同的目标? __construct()是执行此操作的唯一方法吗?

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

4 个答案:

答案 0 :(得分:13)

我认为你以某种方式误解了注释,因为默认值是通过普通的php设置的。

/**
 * @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
}

使用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
    }
}

这就是YAML映射的外观:

    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
    }
}

第二个例子的不同之处在于没有更多的注释,因为映射是通过YAML完成的。班级的建设完全相同。因此,默认值是在构造时设置的,这是在普通的PHP中完成的。

此任务的注释和YAML映射之间没有区别。因此,在底线,您需要编辑生成的PHP类以设置默认值。你无法在YAML中设置它,并且至少在我们发言时让教义为你提供这段代码。

也许我误解了你的问题:),如果是这样,请不要犹豫,纠正我。

希望它有所帮助。

的问候,
马特

答案 1 :(得分:13)

您可以使用注释或yaml中的options属性为列添加默认值。您可以在doctrine annotation documentation了解更多内容。

注释示例:

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

YAML的例子:

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

答案 2 :(得分:2)

您可以尝试使用columnDefinition添加DEFAULT值,但它是DDL,它取决于特定的DBMS(坏事)。按照您的示例,使用MySQL的字段* is_visible *:

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

一般情况下,不是一个好主意,我们鼓励您使用构造函数方法或按实体类中的代码初始化属性...

答案 3 :(得分:1)

时间过去了。现在,您可以通过yaml为列设置默认值。

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