У меня есть Home.blade.php, в котором, если я нажму vote button, он должен увеличить счетчик в таблице кандидат.
home.blade.php
@foreach ($file as $show)
<div class = "col-md-3" style = "margin-bottom: 20px;">
<div class = "card">
<img src = "{{$show->image}}" style = "width:100%">
<div class = "card-body">
<h5 class = "title">President</h5>
<p class = "card-text">Name : {{$show->name}}</p>
<a href = "return Homecontroller@Count"> <button>VOTE</button> </a>
</div>
</div>
</div>
@endforeach
домашний контроллер
public function Count(){
DB::table('candidate')->increment('count');
return view('/home')->with('success', 'voted');
}
Маршрут
Route::get('/home','Homecontroller@Count');
Пожалуйста, помогите мне увеличить счетчик, если нет этого метода, есть ли другой способ сделать то же самое.
Убедитесь, что ваш столбец count является целым числом в миграции.
Не могли бы вы сказать, если вы нажмете на кнопку, то она будет вызвана вашим методом контроллера или нет?
выдает ошибку 404






Убедитесь, что ваш счетчик столбцов имеет целочисленный тип в миграции. И:
Вы неправильно пишете
<a href = "return Homecontroller@Count"> <button>VOTE</button> </a>
изменить его на
<a href = "{{action(Homecontroller@Count)}}"> <button>VOTE</button> </a>
«Действие App\Http\Controllers\Homecontroller@Count не определено. (Просмотр: /home/sachin/dd/sjc-voting-system/sjcvoting/resources/views/home.blade.php)»
Убедитесь, что вы указываете правильный путь к контроллеру
** <a href = "{{action('Homecontroller@Count')}}"> <button>ГОЛОСОВАТЬ</button> </a>**
не могли бы вы предложить мне любую функцию ajax или javascript для этого
Да, есть лучший способ.
Добавьте это в свой web.php
Route::put('/votesUp/{vote}', 'HomeController@upVote')->name('votes.upVote');
Route::put('/votesDown/{vote}', 'HomeController@downVote')->name('votes.downVote');
в вашем списке просмотра это index.blade.php добавьте эти две кнопки
FORM BUILDER WAY
@foreach($candidates as $item)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{!! $item->name !!}</td>
<td>{!! Form::model($item, ['method' => 'PUT', 'route' => ['votes.upVote', $item->id ] ,'enctype'=>'multipart/form-data' ]) !!}
{!! Form::submit( 'Up Vote', ['class' => '', 'name' => 'submitbutton', 'value' => 'upvote'])!!}
{!! Form::close() !!}</td>
<td>{!! Form::model($item, ['method' => 'PUT', 'route' => ['votes.downVote', $item->id ] ,'enctype'=>'multipart/form-data' ]) !!}
{!! Form::submit( 'Down Vote', ['class' => '', 'name' => 'submitbutton', 'value' => 'upvote'])!!}
{!! Form::close() !!}</td>
</tr>
@endforeach
HTML WAY
@foreach($candidates as $item)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{!! $item->name !!}</td>
<td>
<form method = "post" action = "{{ route('votes.upVote', $item->id) }}">
@method('PUT')
@csrf
<input class = "" name = "submitbutton" value = "Up Vote" type = "submit">
</form>
<form method = "post" action = "{{ route('votes.downVote', $item->id) }}">
@method('PUT')
@csrf
<input class = "" name = "submitbutton" value = "Down Vote" type = "submit">
</form>
</td>
</tr>
@endforeach
Я рассматриваю вашу модель как Candidate, так что добавьте это в HomeController
ELOQUENT way
public function upVote(Request $request, $id)
{
Candidate::find($id)->increment('votes_count', 1);
return redirect()->back();
}
public function downVote(Request $request, $id)
{
Candidate::find($id)->decrement('votes_count', 1);
return redirect()->back();
}
DB Facade Way
public function upVote(Request $request, $id)
{
\DB::table('candidates')->where('id','=',1)->increment('votes_count', 1);
return redirect()->back();
}
public function downVote(Request $request, $id)
{
\DB::table('candidates')->where('id','=',1)->decrement('votes_count', 1);
return redirect()->back();
}
Объяснение:
Когда Вы нажмете на кнопку голосования, поле votes_count в candidates таблице будет
увеличенный на 1
Когда вы нажмете кнопку понижения, поле votes_count в candidates таблице будет уменьшенный на 1.
EDIT FOR undefined variable candidate
Найдите эту строку
@foreach($candidates as $item)
И заменить на
@foreach ($file as $item)
ИСПРАВИТЬ ДЛЯ
Class App\Http\Controllers\HomeController does not exist
От
Route::put('/votesUp/{vote}', 'HomeController@upVote')->name('votes.upVote');
Route::put('/votesDown/{vote}', 'HomeController@downVote')->name('votes.downVote');
К
Route::put('/votesUp/{vote}', 'Homecontroller@upVote')->name('votes.upVote');
Route::put('/votesDown/{vote}', 'Homecontroller@downVote')->name('votes.downVote');
Ваш класс контроллера
Homecontroller
но я неправильно написал как
HomeController
Большое спасибо, но он показывает ошибку кандидата неопределенной переменной
спасибо я сделал это, но теперь я получаю такую ошибку
"Класс App\Http\Controllers\HomeController не существует"
Если ваша проблема решена, отметьте вопрос как отвеченный, чтобы в будущем это было полезно.
Кнопка голосования должна быть такой:
<a href = "{{ action('Homecontroller@Count' }}"><button>VOTE</button></a>
С такими функциями, как Upvote и Downvote, на которые хорошо ответил @manojkiran-а выше, я бы также добавил регулирование. Теперь легко создать бота, который будет отправлять запросы на голосование, даже если вы используете токен csrf.
я бы добавил:
'middleware' => 'throttle:5'
Что позволит только 5 запросов в минуту на IP-адрес. Не полностью предотвращая это, но немного усложняя.
Route::put('/votesUp/{vote}', 'Homecontroller@upVote')->middleware('throttle:5')->name('votes.upVote');
Route::put('/votesDown/{vote}', 'Homecontroller@downVote')->middleware('throttle:5')->name('votes.downVote');
Большое спасибо за вашу идею.
Ваш код правильный. С какой проблемой вы столкнулись?