Как обновить положительные и отрицательные голоса изображения на основе записей в моей таблице голосов? - PullRequest
0 голосов
/ 26 мая 2018

Я создал функциональность upvote / downvote, которая использует таблицу voted.Каждая запись в этой таблице содержит идентификатор, user_id, image_id и голосование, которое является целым числом (1 для повышения, 0 для снижения).Моя таблица изображений содержит 2 столбца, один для количества положительных голосов и 1 для количества отрицательных голосов.

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

Любая помощь будет признательна.

Модель голосования:

class Vote extends Model
{
    public function images(){
        return $this->belongsTo('App\Images');
    }
}

Модель изображения:

class Image extends Model
{
    public function votes(){
        return $this->hasMany('App\Vote');
    }
}

Таблица изображений:

Schema::create('images', function (Blueprint $table) {
            $table->increments('id')->unsigned();
            $table->string('name');
            $table->string('description')->nullable()->default(null);
            $table->integer('user_id')->unsigned();
            $table->string('file_name');
            $table->string('upvotes')->default(0);
            $table->string('downvotes')->default(0);
            $table->string('views')->default(0);
            $table->timestamps();
            $table->engine = 'InnoDB';
        });

Таблица голосов:

Schema::create('votes', function (Blueprint $table) {
            $table->increments('id')->unsigned();
            $table->integer('user_id')->unsigned();
            $table->integer('image_id')->unsigned();
            $table->boolean('vote');
            $table->timestamps();
            $table->engine = 'InnoDB';
        });

VotesController

class VotesController extends Controller
{
    public function voteImage(Request $request){
        $image_id = $request['imageId'];
        $isLike = $request['isLike'] === 'true';
        $update = false;
        $image = Image::find($image_id);
        if (!$image){
            return null;
        }
        $user = Auth::user();
        $vote = $user->votes()->where('image_id', $image_id)->first();
        if ($vote) {
            $already_vote = $vote->vote;
            $update = true;
            if ($already_vote == $isLike){
                $vote->delete();
                return null;
            }
        } else {
            $vote = new Vote();
        }
        $vote->vote = $isLike;
        $vote->user_id = $user->id;
        $vote->image_id = $image->id;
        if ($update) {
            $vote->update();
        } else {
            $vote->save();
        }
        return null;
    }
}

1 Ответ

0 голосов
/ 26 мая 2018

вам нужно сделать это после любого изменения в голосовании.добавить метод к модели изображения

class Image extends Model
{
    public function votes(){
        return $this->hasMany('App\Vote');
    }

    public function updateVotes()
    {
        $this->upvotes = Vote::where('image_id', $this->id)->where('vote', true)->count();
        $this->downvotes = Vote::where('image_id', $this->id)->where('vote', false)->count();
        $this->save();
    }
}

и использовать его в контроллере

class VotesController extends Controller
{
    public function voteImage(Request $request){
        $image_id = $request['imageId'];
        $isLike = $request['isLike'] === 'true';
        $update = false;
        $image = Image::find($image_id);
        if (!$image){
            return null;
        }
        $user = Auth::user();
        $vote = $user->votes()->where('image_id', $image_id)->first();
        if ($vote) {
            $already_vote = $vote->vote;
            $update = true;
            if ($already_vote == $isLike){
                $vote->delete();
                $image->updateVotes();
                return null;
            }
        } else {
            $vote = new Vote();
        }
        $vote->vote = $isLike;
        $vote->user_id = $user->id;
        $vote->image_id = $image->id;
        if ($update) {
            $vote->update();
        } else {
            $vote->save();
        }
        $image->updateVotes();
        return null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...