Laravel如何将变量存储到数据库中并在每次单击时更新它

时间:2018-01-19 23:18:52

标签: javascript php laravel vue.js

我有laravel博客,我已经使用Vue.js实现添加到收藏夹选项,它的效果非常好。现在我想实现像post(每个用户都喜欢发布更多次),它就像中等拍手一样,我已经有了拍手按钮并且它有效,每次点击时,$ likeCounter变量都会更新并保持,问题是如何将该变量($ likeCounter)插入数据库(使用javascript,vuejs ......)?喜欢的表有这个列     user_id,post_id,likes_count user_id &使用vue.js插入 post_id (数据透视)

在我的控制器中我有这个方法来附加user_id和post_id

public function like(Post $post)
{
    Auth::user()->likes()->attach($post->id);

    return back();
}
用户模型中的

我有这种方法来获取经过身份验证的用户的所有喜欢的帖子

/**
 * Get all of liked posts for the user.
 */
public function likes()
{
    return $this->belongsToMany(Post::class, 'likes', 'user_id', 'post_id')->withTimeStamps();
}
Post Model中的

我有这个方法

/**
 * Determine whether a post has been liked by a user.
 *
 * @return boolean
 */
public function liked()
{
    return (bool) Like::where('user_id', Auth::id())
                        ->where('post_id', $this->id)
                        ->first();
}

public function likes()
{
    return $this->hasMany('App\Models\Like');
}
在Like.vue中

methods: {
        like(post) {
            axios.post('/like/'+post)
                .then(response => this.isLiked = true)
                .catch(response => console.log(response.data));
        },

我使用一些javascript来更新每次点击的变量,直到当前用户为每个经过身份验证的用户增加最多50个拍子

function updateNumberOfClaps() {
    numberOfClaps < 50 ? numberOfClaps++ : null
    clapCount.innerHTML = "+" + numberOfClaps
    clapTotalCount.innerHTML = initialNumberOfClaps + numberOfClaps
  }

并且运行良好(使用user_id和post_id附加新内容),如果同一用户再次点击同一帖子,则会在具有相同user_id和相同post_id的数据库中附加新内容。 问题是如何在likes_count列中存储变量计数器并在每次点击时更新它,因此我不想一次又一次地使用相同的用户附加相同的帖子,我想存储一个用户喜欢此帖子的变量。 我希望这很清楚

2 个答案:

答案 0 :(得分:1)

likes_count的默认值设置为50.然后,在您的更新方法中:

public function update(Request $request, $id)
{
    try {
        $userId = Auth::id();

        $like = Like::firstOrCreate([
            'user_id' => $userId,
            'post_id' => $id
        ]);

        if ((int)$like->likes_count < 1) {
            // user can not like this post anymore
            return response()->json(['message' => 'Like limit exceeded.']);
        }

        $like->decrement('likes_count');

        return response()->json(['message' => 'Post liked.']);

    } catch (\Exception $e) {
        Log::info('Something went wrong liking post ' . $id . ' by ' . $userId . ': ' . $e->getMessage());
        return response()->json(['message' => 'Error.']);
    }


}

不要忘记包含类(Request,Auth,App \ Like,Log ...)。

答案 1 :(得分:0)

以下是对我之前完成的项目的反应的实现。我将为您提供模型并在我的控制器中删除逻辑以保存反应以帮助您解决问题。

这应该让您对表结构和控制器逻辑有一个很好的理解来处理它。

如果您想了解有关逻辑如何工作的更多详细信息,请询问。希望这会有所帮助。

模型 - 反应和反应类型。

反应表存储对事物的所有反应,它是存储的数据透视表

  • user_id - 反应/喜欢某事的用户
  • 相关表格 - 用户喜欢的对象来自
  • 的表格
  • 相关表格ID - 用户喜欢的内容的引用....这是我找到喜欢其项目的人的地方
  • reaction_type_id - 这是对反应类型的参考(参见反应类型)

ReactionType - 存储人们可以在您的应用中拥有的反应类型:

  • 反应名称 - 用于标记反应的标签(喜欢,不喜欢,讨厌,喜欢等)
  • description - 反应意义的描述。
  • 图标 - 从视图中的图标/图像透视图中显示的内容。

    class Reaction extends Model
    {
        protected $fillable = array('user_id', 'related_table', 'related_table_id', 'reaction_type_id');
        protected $table = 'reactions';
    }
    
    class ReactionType extends Model
    {
        protected $fillable = array('name', 'description', 'icon');
        protected $table = 'reaction_types';
    }
    

控制器 - 这是存储反应的内容我在控制器中有说明解释它。

class ReactionController extends Controller
{

    public function store(Requests\ReactionRequest $request)
    {
        $reaction = array(
            'user_id' => $request->id, 
            'reaction_type_id' => $request->reaction_type_id, 
            'related_table' => $request->related_table, 
            'related_table_id' => $request->related_table_id );
        //Check to see if there's a record already.  You can only have one reaction per item. 
        $CheckInDB = Reaction::where('user_id', '=', $reaction['user_id'])
    ->where('related_table', '=', $reaction['related_table'])
    ->where('related_table_id', '=', $reaction['related_table_id'])->first();
    //If the reaction is in the database then update the type (did they change reaction? 
    if ($CheckInDB) {
        //If they sent the same exact reaction type that is already in the database, then 0 it out... This would indicate they unselected the reaction they provided.
        if($CheckInDB->reaction_type_id == $reaction['reaction_type_id'])   {
            $CheckInDB->reaction_type_id = 0;   
        }
        //Otherwise, update the reaction_type_id with the new reaction.
        else {
            $CheckInDB->reaction_type_id = $reaction['reaction_type_id'];   
        }
        //Update the reaction.
        $CheckInDB->save();
    }
    //If the user has never reacted to the item, then create a new record with that reaction.
    else {
        Reaction::create($reaction);
    }
    return back();
}

}