2015-03-19 4 views
1

У меня есть таблица, которая выглядит следующим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 запись по электронной почте с vote_count, потому что я необходимо хранить информацию, такую ​​как vote_date для каждого голосования, даже если она принадлежит одному и тому же лицу.

+0

написать специальное правило. – itachi

ответ

0

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

$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'); 

voteDate будет null, если e-mail проголосовал за последние 24 часа.

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