我有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列中存储变量计数器并在每次点击时更新它,因此我不想一次又一次地使用相同的用户附加相同的帖子,我想存储一个用户喜欢此帖子的变量。 我希望这很清楚
答案 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)
以下是对我之前完成的项目的反应的实现。我将为您提供模型并在我的控制器中删除逻辑以保存反应以帮助您解决问题。
这应该让您对表结构和控制器逻辑有一个很好的理解来处理它。
如果您想了解有关逻辑如何工作的更多详细信息,请询问。希望这会有所帮助。
模型 - 反应和反应类型。
反应表存储对事物的所有反应,它是存储的数据透视表
ReactionType - 存储人们可以在您的应用中拥有的反应类型:
图标 - 从视图中的图标/图像透视图中显示的内容。
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();
}
}