уникальный — Phalcon PHP: проверить уникальность на натуральном ключе?

У меня есть такой код:

$this->validate(new \Phalcon\Mvc\Model\Validator\Uniqueness(['field' => $field]));
if (true == $this->validationHasFailed()) {
throw new SpecialInternalUniqueException();
}

Это работает для всех столбцов, кроме естественных первичных ключей. То есть первичные ключи, которые не являются суррогатными ключами (автоматически увеличивающиеся целые числа). Например, в таблице job_titles столбец естественного ключа — «job_title», который в нашем случае ссылается на название должности. Это имя должно быть уникальным, и я хочу иметь возможность проверить это в коде перед сохранением. Тем не менее, Фалькон радостно игнорирует это, так или иначе.

Я на самом деле настраиваю модульный тест для этого прямо сейчас и делаю что-то похожее на следующее:

$job_title = new JobTitles();
$job_title->job_title = 'Unique Test';
$job_title->description = 'Desc A';
$job_title->save();

$job_title2 = new JobTitles();
$job_title2->job_title = 'Unique Test';
$job_title->description = 'Desc B';
$job_title->save();

Исключение никогда не выбрасывается. То, что заканчивается в базе данных, это один столбец для первого уникального теста с Desc A, и нет записи для второго. Но я не получаю исключение.

Какие-нибудь мысли?

РЕДАКТИРОВАТЬ:

Также я попытался использовать функцию -> create () вместо функции save ().

0

Решение

Во-первых, вы должны знать, что в поведении по умолчанию эти проверки создаются из фактической схемы базы данных сразу после Модельный класс инициализирован; вы не должны добавлять их вручную в этом случае.

Другими словами, стратегия метаданных по умолчанию для моделей — это Стратегия самоанализа базы данных

Таким образом, исключение будет выдвинуто только в том случае, если job_title поле уже проиндексировано для проверки уникальности в схеме базы данных. Если вы не можете создать этот PK в базе данных, вы можете изменить значение по умолчанию стратегия метаданных для ваших моделей и их установить метаданные вручную (вздох).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]