我们在MySQL数据库中有两个表(这是简短的示例):
CREATE TABLE `user`(
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`details` BIGINT(20) DEFAULT NULL,
PRIMARY KEY (`id`)
UNIQUE KEY `UNQ_FK_user_details` (`details`)
CONSTRAINT `UNQ_FK_user_details` FOREIGN KEY (`details`) REFERENCES `user_details` (`id`) ON DELETE SET NULL,
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 COMMENT='User';
CREATE TABLE `details`(
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`full_name` TEXT NOT NULL,
`user_data` TEXT DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 COMMENT='User detailed data';
这两个表在 details 中的主键和 user 中的唯一键之间具有一对一的单向关系(但它可以为NULL值)。我们在Symfony 2框架中使用ORM主义2(2.5)。该表的实体:
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(
* name="user",
* uniqueConstraints={
* @ORM\UniqueConstraint(name="UNQ_FK_user_details", columns={"details"})
* }
* )
*/
class User
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var Details $details
*
* @ORM\OneToOne(targetEntity="Details", cascade={"persist"}, fetch="EAGER")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="details", referencedColumnName="id", nullable=true, onDelete="SET NULL")
* })
*/
private $details;
//.....
}
class Details
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
//.....
}
因此,当我们运行原则架构验证命令时,它已同步返回错误。架构更新命令提供了向用户表中的detail字段添加一个唯一键的方法-由于某些原因,Doctrine忽略了该字段的现有和带注释的唯一键。我们已经尝试过分别使用索引和唯一键,即两个唯一键,不为唯一键添加注释-没有帮助。任何想法哪里出了问题?