Symfony 4 @UniqueEntity не работает с составными полями дерева GEDMO

Кажется, я сделал настройку правильно, но все равно это не работает, то есть неправильно настроит таблицу базы данных. Фактически он полностью игнорирует аннотацию @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;

....
}

На самом деле есть аналогичный вопрос здесь, без решения.

Что вы имеете в виду под «он не установит таблицу базы данных правильно»? UniqueEntity является частью валидатора symfony, который работает на уровне вашего php-приложения, он ничего не меняет в вашей базе данных.

Iwan Wijaya 18.06.2018 17:53

У меня создалось впечатление, что это создаст составной ключ для таблицы. Как иначе он узнал бы, что вводимое значение нарушит ограничение? Он должен относиться к db.

BernardA 18.06.2018 18:42

Выполняя запрос на основе указанных полей. Валидатор действительно взаимодействует с базой данных, но не меняет его. UniqueEntity запускается только при использовании компонента валидатора symfony.

Iwan Wijaya 18.06.2018 20:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
368
1

Ответы 1

Если вы хотите проверить уровень базы данных, вам нужно будет использовать аннотацию Doctrine Уникальное ограничение:

/*
 * @ORM\Table(name = "categories", uniqueConstraints = {
 *     @ORM\UniqueConstraint(name = "uq_cat_parent_title", columns = {"parent_id", "title"})
 * })
 */

Обновлено: изменил свой ответ, чтобы включить имя индекса. В документации Doctrine указано, что это необходимо.

Спасибо, но doctrine: migrations: diff просто не получит эти аннотации.

BernardA 18.06.2018 19:14

Что вы имеете в виду, что они не получат эти аннотации?

Jason Roman 18.06.2018 19:20

Если уникальный индекс уже существует в вашей базе данных, вероятно, нечего создавать. Я добавил name к своему ответу для уникального ключа.

Jason Roman 18.06.2018 19:27

Уникальный составной индекс еще не существует в базе данных. Когда я говорю, что миграция не подхватит это, это означает, что это результат: Никаких изменений в вашей информации сопоставления не обнаружено.

BernardA 18.06.2018 19:32

Попробуйте добавить name, как я сделал в свой ответ.

Jason Roman 18.06.2018 19:37

У меня возникла проблема с кешем, которая не позволяла перенести изменения. Итак, теперь он будет правильно сгенерировать индекс таблицы, НО он выдаст ошибку 500, когда я попытаюсь добавить значение, дублирующее индекс. Я хочу получать регулярные сообщения об ошибках, как это делает ASSERT.

BernardA 20.06.2018 08:51

Вы должны получить исключение Doctrine, которое вы можете попробовать / поймать. Если вы хотите получить его через assert, вам придется использовать компонент Symfony Validator.

Jason Roman 20.06.2018 09:00

Другие вопросы по теме