【问题标题】:What is the difference b/w setting default value by the options attribute and setting it through the variable directly?通过选项属性设置默认值和直接通过变量设置有什么区别?
【发布时间】:2016-07-27 23:10:15
【问题描述】:

如果你想知道如何在 symfony2 中设置默认值,请查看here

我可以通过两种方式进行设置。比如我可以像这样直接通过变量来设置。

/**
 * @var string $variable
 *
 * @ORM\Column(name="variable", type="string", nullable=true)
 */
private $variable = "default_value";

或者我可以使用选项属性

/**
 * @var string $variable
 *
 * @ORM\Column(name="variable", type="string", nullable=true,options={"default" = "default_value"})
 */
private $variable = "default_value";

我想知道这两者的黑白区别是什么。更重要的是,第一种方法不够用的情况是什么,必须使用 options 属性。

据我目前所知,设置变量直接在 symfony2 级别设置默认值,而 options 属性将其设置为教义。在 ORM 级别设置默认值有什么区别,什么时候与 symfony2 默认值冲突?如果我只使用两者之一会发生什么。

【问题讨论】:

标签: symfony doctrine


【解决方案1】:

您是对的,不同之处在于该值是在不同级别上设置的。详细说明,如果您使用以下方法创建默认值:

/**
 * @var string $variable
 *
 * @ORM\Column(name="variable", type="string", nullable=true)
 */
private $variable = "default_value";

何时使用默认值创建新对象。

$a = new MyClass();
$a->getVariable(); // -> 'default_value'

因此可以立即访问实际的默认值。如果您使用第二种方法:

/**
 * @var string $variable
 *
 * @ORM\Column(name="variable", type="string", nullable=true,options={"default" = "default_value"})
 */
private $variable;

这将导致 DB 中的架构将包含列的默认值,以便在保存实体后可以访问该值

$a = new MyClass();
$a->getVariable(); // -> null
$em->perist($a);
$em->flush();
$a->getVariable(); // -> 'default_value'

我会说这是基本的区别。这实际上取决于您想要控制默认值的位置以及何时拥有它们。

在我看来,在大多数情况下,实体本身的赋值更好,因为如果您想稍后在系统中更改值,您需要做的就是更新实体上的值。

如果您将在数据库中使用默认值,那么更新到不同的值将需要更新注释,然后创建迁移以更改 DB 字段中的默认值

更新(迁移问题)

如果您使用 Doctrine 注释中指定的默认值,并且您正在为 Symfony 项目使用 Doctrine 迁移包,并且您将手动为此类编写迁移(而不是使用 php app/console doctrine:migrations:diff),您需要手动指定默认作为一个选项。注释本身只是说明列定义的外观。

如果只在 PHP 中设置了默认值,即private $variable = 'default_value'; 迁移包将完全不受它的影响。这意味着如果您运行php app/console doctrine:migrations:diff,则该字段的DEFAULT 值将不会被填写。当然,如果您自己编写迁移,只有您自动填写时,数据库中的默认值才会存在。

总结迁移 budle 功能 - 自动生成的迁移仅受 @ORM\Column 注释中的默认值影响。

【讨论】:

  • 谢谢。正是我需要的。还有一件事。如果我使用 ONLY symfony 级别默认值,它会影响实体创建迁移吗?例如,如果我没有在迁移中指定默认值,它是否能够获取 symfony 级别的默认值,或者我是否需要为此设置选项属性?
  • 我更新了答案。我假设 ONLY symfony 级别默认值 您的意思是 Doctrine @Column 注释的默认值。如更新中所述,如果您手动编写迁移,那么您当然需要自己指定列。如果您使用php app/console doctrine:migrations:diff 命令自动生成迁移,它会处理它。但无论如何,我真的建议使用我上面提到的 PHP 级别的默认值。
  • 不,通过 symfony 级别的默认值,我的意思是私有 $variable="false";
  • 抱歉,在这种情况下,它根本不会影响数据库模式,也不需要这样做,因为您在 PHP 端处理默认值
  • 已更新,对您的问题的简短回答 - 1) 否 2) 否。 PHP 级别定义的默认值根本不会影响 migraions 包 => DB 列中没有默认值。
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多