Значение столбца по умолчанию с Doctrine2 и Symfony2 с использованием YAML? - PullRequest
5 голосов
/ 02 марта 2012

Использование аннотаций довольно просто установить значение по умолчанию для данного столбца и инициализировать коллекции для отношений сущностей:

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 ]

13 голосов
/ 08 октября 2014

Вы можете добавить значение по умолчанию для столбца, используя свойство options в аннотации или yaml.Вы можете прочитать больше в документации аннотации доктрины .

Пример аннотации:

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

Пример для YAML:

isVisible:
    type: boolean
    column: is_visible
    options: 
        default: false
13 голосов
/ 02 марта 2012

Я думаю, что вы как-то неправильно поняли аннотации, потому что значение по умолчанию устанавливается через обычный 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 и позволить доктрине поставить этот код для вас, по крайней мере, во время нашего разговора.

Может быть, я неправильно понял ваш вопрос :), если это так, не спрашивайтене стесняйтесь поправлять меня.

Надеюсь, это поможет.

С уважением,Matt

2 голосов
/ 15 февраля 2013

Вы можете попробовать добавить значение DEFAULT с помощью columnDefinition , но оно равно DDL и зависит от конкретной СУБД (что плохо).Следуя вашему примеру, поле * is_visible * использует MySQL:

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

В общем, это не очень хорошая идея , и вам рекомендуется использовать метод конструктора или инициализацию свойства с помощью кодав пределах класса сущности ...

1 голос
/ 08 февраля 2016

Время прошло.Теперь вы можете установить значение по умолчанию для столбца через yaml.

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