Кажется, я сделал настройку правильно, но все равно это не работает, то есть неправильно настроит таблицу базы данных. Фактически он полностью игнорирует аннотацию @UniqueEntity.
Я настраиваю GEDMO дерево, где заголовок категории не должен повторяться для одного и того же parent_id.
Итак, глядя на Документация @UniqueEntity, а также на некоторый предыдущий код, который я создал, это должно сработать:
/ Приложение / Сущность / Категория
namespace App\Entity;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @Gedmo\Tree(type = "nested")
* @ORM\Entity(repositoryClass = "App\Repository\CategoryRepository")
* @UniqueEntity(
* fields = {"parent", "title"}, // or fields = {"parent_id", "title"}
* errorPath = "title",
* message = "This title is already in use for this parent.")
* @ORM\Table(name = "categories")
*/
class Category
{
/**
* @ORM\Column(type = "integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
/**
* @ORM\Column(type = "string", length=190)
*/
private $title;
.....
/**
* @Gedmo\TreeParent
* @ORM\ManyToOne(targetEntity = "Category", inversedBy = "children")
* @ORM\JoinColumn(referencedColumnName = "id", onDelete = "CASCADE")
*/
private $parent;
....
}
На самом деле есть аналогичный вопрос здесь, без решения.
У меня создалось впечатление, что это создаст составной ключ для таблицы. Как иначе он узнал бы, что вводимое значение нарушит ограничение? Он должен относиться к db.
Выполняя запрос на основе указанных полей. Валидатор действительно взаимодействует с базой данных, но не меняет его. UniqueEntity запускается только при использовании компонента валидатора symfony.






Если вы хотите проверить уровень базы данных, вам нужно будет использовать аннотацию Doctrine Уникальное ограничение:
/*
* @ORM\Table(name = "categories", uniqueConstraints = {
* @ORM\UniqueConstraint(name = "uq_cat_parent_title", columns = {"parent_id", "title"})
* })
*/
Обновлено: изменил свой ответ, чтобы включить имя индекса. В документации Doctrine указано, что это необходимо.
Спасибо, но doctrine: migrations: diff просто не получит эти аннотации.
Что вы имеете в виду, что они не получат эти аннотации?
Если уникальный индекс уже существует в вашей базе данных, вероятно, нечего создавать. Я добавил name к своему ответу для уникального ключа.
Уникальный составной индекс еще не существует в базе данных. Когда я говорю, что миграция не подхватит это, это означает, что это результат: Никаких изменений в вашей информации сопоставления не обнаружено.
Попробуйте добавить name, как я сделал в свой ответ.
У меня возникла проблема с кешем, которая не позволяла перенести изменения. Итак, теперь он будет правильно сгенерировать индекс таблицы, НО он выдаст ошибку 500, когда я попытаюсь добавить значение, дублирующее индекс. Я хочу получать регулярные сообщения об ошибках, как это делает ASSERT.
Вы должны получить исключение Doctrine, которое вы можете попробовать / поймать. Если вы хотите получить его через assert, вам придется использовать компонент Symfony Validator.
Что вы имеете в виду под «он не установит таблицу базы данных правильно»?
UniqueEntityявляется частью валидатора symfony, который работает на уровне вашего php-приложения, он ничего не меняет в вашей базе данных.