Валидатор Laravel: сложное правило для существующего правила

У меня есть стол, который выглядит так

vote_id
voter_email
target_id
vote_date

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

['email' => "exists:participants_votes,voter_email,target_id,$targetId,vote_date,$date"];

Как я могу проверить дату для диапазона? Есть ли способ сделать это без написания собственного кода?

Здесь after:date валидатор, но он должен быть в том же объеме, что и exists:

По сути, что-то вроде этого: (хотя этот sql может быть совершенно неверным)

Select MAX(vote_date) FROM parcitipants_votes WHERE voter_email = ?

тогда я бы проверил, если эта дата> сейчас - 24 часа.

Я пытаюсь сделать это "правильным" способом с помощью валидатора, но, возможно, это не предназначено для этого...

Примечание: я не могу просто иметь 1 запись на электронное письмо с помощью voice_count, потому что мне нужно хранить такую ​​информацию, как voice_date для каждого голоса, даже если она принадлежит одному и тому же человеку.

1 ответ

Решение

Я решил не использовать валидатор для этого сложного сценария и просто запросить базу данных, это было просто и эффективно.

$voteDate = \DB::table('participants_votes')
              ->where('voter_email', '=', $user->email)
              ->where('contest_id', '=', $contestId)
              ->where('target_user_id', '=', $targetId)
              ->where('created_at', '>', new \DateTime('now -24 hours'))
              ->pluck('created_at');

Голосование будет недействительным, если электронное письмо проголосовало за последние 24 часа.

Другие вопросы по тегам