Doctrine 2.5 允许
@Embeddable
and@Embedded
注释 - 让开发人员能够与Value Objects一起创建实体。如果您使用的是作曲家,截至2014年5月,您需要在composer.json中使用"minimum-stability": "dev"
来使用它。
我有一个Server
实体,我正试图映射一个IpAddress
值对象。 @Embeddable
和@Embedded
在这里运作良好。
但是,我希望Server
实体在unique
属性上有一个ipAddress
约束 - 它映射到值对象。这适用于普通属性,但对于嵌入式属性,我在尝试从我的实体更新模式时遇到异常:
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;
}
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
语法,但这是一个完整的猜测,自然也失败了。
答案 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;