0

У меня есть некоторый код, как это: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, и никакой записи для второго. Но я не получаю исключение.

Любые мысли?

EDIT:

Кроме того, я попытался с -> создать функцию() вместо функции сохранения().

ответ

1

Прежде всего вам следует знать, что в поведении по умолчанию эти проверки создаются из реальной схемы базы данных сразу после model class is initialized; вы не должны добавлять их вручную в этом случае.

Другими словами, стратегия мета-данные по умолчанию для моделей является Database Introspection Strategy

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

+0

Даже с помощью стратегии Introspection Database ничего не происходит, когда я пытаюсь добавить вторую запись с тем же естественным ключом. Как-то Фалкон не узнает его. –

+0

Также - я был бы более чем счастлив, чтобы позволить Фалкону все это для меня. Однако есть ли способ определить и выбросить мои собственные исключения, когда проверка не выполняется на основании того, что это не так? –

+0

Хм ... более того, если я не буду обрабатывать свою собственную проверку на такие вещи, как максимальная длина, Фалкон ничего не делает. Я просто попытался поместить что-то в БД, которая проходит мимо длины поля. Оба Phalcon и DB с радостью выполнили и засунули мои данные (усеченные) в столбец ... –

Смежные вопросы