Валидатор 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 часа.