Правило валидации Yii2: Как проверить, что дата и время не сталкиваются с другой записью?

Это мой стол event

образ

Как вы видите

Транзакция 1

time_begin: 2016-03-10 07:00:00
time_end:   2016-03-10 08:00:00
place:      1

Если пользователь совершает транзакцию 2, а затем выбирает

time_begin: 2016-03-10 07:15:00
time_end:   2016-03-10 07:45:00
place:      1

Как сделать пользовательское правило проверки, которое проверяет дату и время, не используется в другой транзакции?

Итак, я попробовал это:

// models.php

public function rules()
{
return [
[['title', 'description', 'time_begin', 'time_end', 'place'], 'required'],
[['description', 'status'], 'string'],
[['time_begin', 'time_end'], 'safe'],
[['title'], 'string', 'max' => 150],
[['place'], 'string', 'max' => 50],
[['remark'], 'string', 'max' => 145],
[['time_end'], 'compare','compareAttribute'=>'time_begin','operator'=>'>','message'=>''],
[['place', 'time_begin'], 'unique', 'targetAttribute' => ['place', 'time_begin'],'message'=>'time and place is busy place select new one.'],
[['place'], 'checkDate','skipOnEmpty' => false],
];
}public function checkDate($attribute, $params)
{
$a = Event::find()->where(['>=', 'time_begin', ($this->time_begin)])->count();
$b = Event::find()->where(['<=', 'time_end', ($this->time_end)])->count();
$c = Event::find()->where(['=', 'place', ($this->place)])->count();
$d = ($this->time_begin);
$e = ($this->time_end);
$f = ($this->place);
if (($d > $a) && ($f = $c))
{
$this->addError($attribute, 'This place and time is busy, selcet new place or change time.');
}
}

Это не будет работать, потому что это if (($d > $a) && ($f = $c)) неправильно.

Но я не знаю, как написать условие для проверки этой вещи.

2

Решение

Может ли это помочь:

public function checkDate($attribute, $params)
{
$thereIsAnOverlapping = Event::find()->where(
['AND',
['place' => $this->place],
['<=', 'time_begin', $this->time_end],
['>=', 'time_end', $this->time_begin]
])->exists();

if ($thereIsAnOverlapping) {
$this->addError($attribute, 'This place and time is busy, selcet new place or change time.');
}
}

Это проверяет, есть ли другое событие, которое имеет ту же комнату И имеет перекрытие времени (полностью или частично).

С этим я думаю, что вы могли бы опустить правило для ['place', 'time_begin'],

0

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

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

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