在Doctrine 2.5和Unique Constraints中使用@Embedded / @Embeddable

时间:2014-05-26 10:16:41

标签: php doctrine-orm

  

Doctrine 2.5 允许@Embeddable and @Embedded注释 - 让开发人员能够与Value Objects一起创建实体。如果您使用的是作曲家,截至2014年5月,您需要在composer.json中使用"minimum-stability": "dev"来使用它。

我有一个Server实体,我正试图映射一个IpAddress值对象。 @Embeddable@Embedded在这里运作良好。

但是,我希望Server实体在unique属性上有一个ipAddress约束 - 它映射到值对象。这适用于普通属性,但对于嵌入式属性,我在尝试从我的实体更新模式时遇到异常:

Doctrine SchemaException - @Embeddable @Embedded

服务器实体

namespace App\Model\Entity;

use App\Model\Entity\ValueObjects\Server\IpAddress,
    Doctrine\ORM\Mapping as ORM;

/**
 * Class Server
 *
 * @ORM\Table(name="servers", uniqueConstraints={@ORM\UniqueConstraint(name="unique_ip_address", columns={"ipAddress"})})
 * @ORM\Entity(repositoryClass="App\Model\Repository\ServerRepository")
 */
class Server
{
   /**
    * @var IpAddress
    *
    * @ORM\Embedded(class="App\Model\Entity\ValueObjects\Server\IpAddress")
    */
    private $ipAddress;
}

IpAddress Value Object

namespace App\Model\Entity\ValueObjects\Server;

use Doctrine\ORM\Mapping as ORM;

/**
 * Class IpAddress
 *
 * @package App\Model\Entity\ValueObjects\Server
 *
 * @ORM\Embeddable
 */
class IpAddress
{
    /**
     * @var string
     *
     *  @ORM\Column(name="ip_address", type="string", length=15, nullable=false)
     */
    private $ipAddress;
}

我认为我正确地将类映射到一起。 如何在嵌入对象的属性上设置unique约束?我在定义.的列部分时尝试了uniqueConstraints语法,但这是一个完整的猜测,自然也失败了。

1 个答案:

答案 0 :(得分:7)

  

Jimbo的编辑:基本上,答案是从Server对象中删除UniqueConstraints,并将唯一值直接放在值对象属性上。

根据您的架构输出,索引中的列名应为ipAddress_ip_address

  

@ORM \表(名称="服务器&#34 ;,   uniqueConstraints = {@ ORM \的UniqueConstraint(名称=" unique_ip_address&#34 ;,   列= {"的 ipAddress_ip_address "})})

或者,如果IP地址在其嵌入的所有表中都是唯一的,那么您可以将约束放在IpAddress类中。

/**
 * @var string
 *
 *  @ORM\Column(name="ip_address", type="string", length=15, nullable=false, unique=true)
 */
private $ipAddress;