我正在创建一个使用NestedTree行为实现的文件夹结构。此外,如果它们是兄弟姐妹,我不希望两个文件夹可能具有相同的名称。为此,我使用@UniqueEntity
和@UniqueConstraint
注释的组合,但它不起作用。
首先我的实体(剥离到最低限度,因为它与 NestedTree 默认值 100% 相同):
/**
* @ORM\Entity
* @Gedmo\Tree(type="nested")
* @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
* @UniqueEntity(fields={"parent", "name"})
* @ORM\Table(uniqueConstraints={@ORM\UniqueConstraint(name="uniq_url", columns={"parent_id", "name"})})
*/
class Folder
{
/**
* @ORM\Column(type="string", nullable=false)
*/
protected $name;
/**
* @Gedmo\TreeParent
* @ORM\ManyToOne(targetEntity="Folder", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $parent;
}
第一次尝试(ignoreNull = true)
当我创建两个具有相同名称的文件夹时,我违反了完整性约束,这意味着@UniqueConstraints
数据库中的 工作但@UniqueEntity
没有:
Integrity constraint violation: 1062 Duplicate entry 'name_of_folder' for key 'uniq_url'
第二次尝试(ignoreNull = false)
我还尝试将 ignoreNull 键设置为 false(默认为 true):
@UniqueEntity(fields={"parent", "name"}, ignoreNull=false)
但后来我得到这个错误:
Warning: ReflectionProperty::getValue() expects parameter 1 to be object, null given in vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php line 670
我已将错误归结为以下几行Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator
:
$criteria[$fieldName] = $class->reflFields[$fieldName]->getValue($entity);
if ($constraint->ignoreNull && null === $criteria[$fieldName]) {
return;
}
if ($class->hasAssociation($fieldName)) {
/* Ensure the Proxy is initialized before using reflection to
* read its identifiers. This is necessary because the wrapped
* getter methods in the Proxy are being bypassed.
*/
$em->initializeObject($criteria[$fieldName]);
$relatedClass = $em->getClassMetadata($class->getAssociationTargetClass($fieldName));
//problem
$relatedId = $relatedClass->getIdentifierValues($criteria[$fieldName]);
if (count($relatedId) > 1) {
throw new ConstraintDefinitionException(
"Associated entities are not allowed to have more than one identifier field to be " .
"part of a unique constraint in: " . $class->getName() . "#" . $fieldName
);
}
$criteria[$fieldName] = array_pop($relatedId);
}
问题出现在标有 的行上//problem
。看来这$criteria[$fieldName] === null
是错误的原因。
所以我在这里,不知道该怎么做......有人知道发生了什么吗?
谢谢你。