Yii2: Как добавить CHECK CONSTRAINT к моей модели? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть ПРОВЕРКА КОНТРОЛЯ таблицы в моей базе данных PostgreSQL:

CHECK (since <= until)

, поскольку и до - даты.

Я хотел бы добавить это ограничение к моей модели, но я не знаю, как это сделать:

public function rules()
{
    return [
        [['since', 'until'], 'required'],
        [['since', 'until'], 'safe'],
    ];
}

1 Ответ

0 голосов
/ 31 мая 2018

Вам необходимо использовать CompareValidator:

public function rules()
{
    return [
        [['since', 'until'], 'required'],
        [['since'], 'compare', 'compareAttribute' => 'util', 'operator' => '<='],
    ];
}

Это будет выполнять сравнение строк и должно работать, если вы используете даты в формате ISO 8601 ,В другом случае вам необходимо сначала преобразовать даты в метку времени:

public function rules()
{
    return [
        [['since', 'until'], 'required'],
        ['since', 'date', 'timestampAttribute' => 'since'],
        ['until', 'date', 'timestampAttribute' => 'until'],
        [['since'], 'compare', 'compareAttribute' => 'util', 'operator' => '<=', 'enableClientValidation' => false],
    ];
}

Валидатор сравнения можно использовать только для сравнения строк и чисел.Если вам нужно сравнить значения, такие как даты, у вас есть два варианта.Для сравнения даты с фиксированным значением вы можете просто использовать валидатор date и указать его свойство $min или $max.Если вам нужно сравнить две даты, введенные в форму, например, поле fromDate и поле toDate, вы можете использовать комбинацию сравнения и валидатора даты, как показано ниже:

['fromDate', 'date', 'timestampAttribute' => 'fromDate'],
['toDate', 'date', 'timestampAttribute' => 'toDate'],
['fromDate', 'compare', 'compareAttribute' => 'toDate', 'operator' => '<', 'enableClientValidation' => false],

Поскольку валидаторывыполняется в том порядке, в котором они указаны, это сначала проверит, что значения, введенные в fromDate и toDate, являются действительными значениями даты и, если это так, они будут преобразованы в машиночитаемый формат.После этого эти два значения сравниваются с валидатором сравнения.Проверка клиента не включена, поскольку это будет работать только на стороне сервера, поскольку средство проверки даты в настоящее время не обеспечивает проверку клиента, поэтому $enableClientValidation также установлено на false и на устройстве проверки сравнения.

https://www.yiiframework.com/doc/guide/2.0/en/tutorial-core-validators#comparing-date-values

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...