У меня есть такой код:
$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 ().
Во-первых, вы должны знать, что в поведении по умолчанию эти проверки создаются из фактической схемы базы данных сразу после Модельный класс инициализирован; вы не должны добавлять их вручную в этом случае.
Другими словами, стратегия метаданных по умолчанию для моделей — это Стратегия самоанализа базы данных
Таким образом, исключение будет выдвинуто только в том случае, если job_title
поле уже проиндексировано для проверки уникальности в схеме базы данных. Если вы не можете создать этот PK в базе данных, вы можете изменить значение по умолчанию стратегия метаданных для ваших моделей и их установить метаданные вручную (вздох).
Других решений пока нет …