Метаданные Doctrine ORM для специального идентификатора, не представляющие никаких отношений в столбце, который не можетMySql

Форум по Mysql
Ответить
Anonymous
 Метаданные Doctrine ORM для специального идентификатора, не представляющие никаких отношений в столбце, который не может

Сообщение Anonymous »

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

Код: Выделить всё

CREATE TABLE discount_rule (
business_id int not null,
category_id int not null default 0, -- zero in the id is used to represent it applies across all categories
brand_id    int not null default 0,
..., -- bunch of other properties
PRIMARY KEY (business_id, category_id, brand_id)
);
сейчас объект выглядит примерно так:

Код: Выделить всё

class DiscountRule
{
#[Column(type: 'integer')]
#[Id]
private int $businessId;

#[Column(type: 'integer')]
#[Id]
private int $categoryId;

#[Column(type: 'integer')]
#[Id]
private int $brandId;

...
}
когда я хочу, чтобы это выглядело примерно так:

Код: Выделить всё

class DiscountRule
{
#[ManyToOne(...)]
#[Id]
private Business $businessId;

#[ManyToOne(...)]
#[Id]
private ?Category $categoryId;

#[ManyToOne(...)]
#[Id]
private ?Brand $brandId;

...
}
Теперь использование null для обозначения отсутствия связанной сущности, похоже, является тем, что здесь обычно делает доктрина, однако mysql не допускает первичных ключей, допускающих значение null. Я рад перейти к использованию ограничения уникальности, но, опять же, mysql фактически не ограничивает столбцы с нулевым значением, поэтому мы не можем защититься от создания двух правил для «Категория = 1 Бренд = Любой». Потеря ограничения уровня базы данных, к сожалению, не является вариантом, поскольку есть старые части кода, которые напрямую запрашивают базу данных и не проходят через доктрину.
Использование прокси-ссылки кажется неправильным, поскольку ->getReference(Category::class, 0) не является сущностью и обрабатывается так, как если бы это могло означать, что эта недопустимая ссылка взорвется в неожиданных местах кода.
Что я действительно ищу здесь, так это что-то вроде настроить отображение доктрины так, чтобы то, что является нулем в классе сущностей, обезвоживалось до 0 в базе данных и наоборот. Таким образом, схему не нужно менять, но я могу использовать сущность со связью. Если вышеописанное невозможно, я был бы открыт для изменений схемы, пока ограничение уникальности не потеряно.
Текущий код, похоже, работает, хотя загрузка такого объекта будет иметь отношение к объекту Proxy с id=0, который кажется, что он взорвется с исключением где-то неожиданно, поэтому кажется, что null будет гораздо более безопасным отображением.

Подробнее здесь: https://stackoverflow.com/questions/798 ... olumn-that
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»