为什么在Doctrine中使用MySQL ENUM很困难?

时间:2015-08-09 09:07:27

标签: mysql doctrine-orm

Doctrine and mySQL Enum,我读到了:

  

Mysql Enums

     

Doctrine 2的类型系统由flyweights组成,意思是   只有一个任何给定类型的实例。另外类型呢   不包含国家。这两种假设都使它变得相当复杂   使用Enum Type of MySQL

我会喜欢外行语言解释它意味着什么。感谢。

1 个答案:

答案 0 :(得分:3)

  

Doctrine 2的类型系统由flyweights组成,意思是   只有一个任何给定类型的实例。

Flyweight类创建不可变的值对象。因此,他们以这种方式与字符串类似,即

$String = "myString";

这将创建一个无法更改的String对象。对此的任何更改都会导致新的String对象。 Flyweight类的相似之处在于,一旦通过构造函数创建了新对象,它就无法更改,并且它具有相同的值。但是,Flyweight类最终比使用字符串更容易消耗。

https://en.wikipedia.org/wiki/Flyweight_pattern在一个较大的CoffeeShop实现中使用Flyweight类CoffeeFlavour的几种语言中的示例有一些很好的例子。这是一个应该是PHP的例子,我很快就嘲笑了:

<?php
class CoffeeFlavour {
  private $name;

  function __construct(String newFlavor) {
    $this->name = newFlavor;
  }

  public __toString() {
    return $this->name;
  }
}

所以CoffeeFlavour的每个实例都是它自己的CoffeeFlavour,用于订单等。

  

此外,类型不包含状态。

详细说明上述内容:与字符串类似,Flyweight类不能更改实例。一旦它被构建,它就是它。所以在上面的例子中,String&#34; myString&#34;就是这样。字符串中的任何更改都将导致创建新对象。

要使用CoffeeFlavour的例子,改变咖啡的味道会非常荒谬!这就是您没有看到setName()方法的原因。换句话说,请参阅以下内容:

$caffeineCoffee = new CoffeeFlavour("Caffeinated");
$decafCoffee = new CoffeeFlavour("Decaf");

你不能说'&#34;状态&#34;咖啡因的一个突然变成了脱咖啡因。你会创建一个新的不同的饮料。这增加了它们的不变性。

当我订购饮料时,我说:$myDrink = $caffeineCoffee;因此引用羽量级的对象。这些物品没有状态,它们就是,它们是什么。

另一方面,MySQL有一个列(类型),根据值列表,它具有状态。所以这直接与学说2的方法论相冲突。以下进一步阐述。

  

两种假设都使得使用Enum变得相当复杂   MySQL的类型

根据MySQL的文档https://dev.mysql.com/doc/refman/5.0/en/enum.html页面:

  

ENUM是一个字符串对象,其值从允许值列表中选择,这些值在表创建时在列规范中显式枚举。

在这种情况下,MySQL列(类型)包含一个状态(它拥有哪个允许值)。这些是在创建表时确定的,并且允许值的任何更改都需要删除并重建表。但是,Flyweight类(如上所述)很容易根据需要添加新实例。 Flyweight类的每个类型(实例)都是唯一的,不可变的。

总结如下:

  • Flyweight课程(如CoffeeFlavour)不会被覆盖,他们会根据需要添加其他实例。
  • 这些实例永远不会改变状态。它们永远是它们创建时的样子。
  • Flyweight类的实例是几个没有状态的唯一对象,而不是一个具有多种可能状态的MySQL列。

希望这能回答你的问题!