NestedTreeの動作で実装されたフォルダー構造を作成しています。さらに、兄弟の場合、2つのフォルダーが同じ名前になることは望ましくありません。このために、注釈@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)
同じ名前で2つのフォルダーを作成すると、整合性制約違反が発生します。@UniqueConstraints
つまり、データベース内のは機能しましたが、機能@UniqueEntity
しませんでした。
Integrity constraint violation: 1062 Duplicate entry 'name_of_folder' for key 'uniq_url'
2回目の試行(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
エラーの原因のようです。
だからここにいる、何をすべきかわからない...誰かが何が起こっているのかについての考えを持っていますか?
ありがとうございました。