laravel like and

2025-03-05 0 10

Laravel Like And

解决方案简述

在Laravel应用程序中,实现“点赞”(Like)功能是增强用户交互体验的重要部分。通过该功能,用户可以对帖子、评论或其他内容表示赞同或喜欢。介绍如何在Laravel中实现点赞功能,并提供多种实现思路。

我们将从创建数据库结构开始,接着编写模型和控制器代码,最后展示如何通过视图与用户进行交互。为了确保系统的灵活性和可扩展性,我们还会探讨不同场景下的优化方案。

创建数据库表结构

我们需要为点赞功能创建相应的数据库表。通常我们会创建一个likes表来记录用户的点赞行为。可以通过Artisan命令生成迁移文件:

bash
php artisan make:migration create_likes_table --create=likes

编辑生成的迁移文件database/migrations/xxxx_xx_xx_create_likes_table.php

php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;</p>

<p>class CreateLikesTable extends Migration
{
    public function up()
    {
        Schema::create('likes', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained()->onDelete('cascade');
            $table->morphs('likeable'); // 支持多态关联
            $table->timestamps();
        });
    }</p>

<pre><code>public function down()
{
    Schema::dropIfExists('likes');
}

}

执行迁移命令:

bash
php artisan migrate

定义模型关系

接下来,我们需要定义模型之间的关系。假设我们要为帖子(Post)添加点赞功能,那么可以在Post模型中定义如下方法:

php
// app/Models/Post.php
namespace AppModels;</p>

<p>use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsMorphMany;</p>

<p>class Post extends Model
{
    public function likes(): MorphMany
    {
        return $this->morphMany(Like::class, 'likeable');
    }</p>

<pre><code>public function likedBy(User $user): bool
{
    return $this->likes()->where('user_id', $user->id)->exists();
}

}

User模型中也需要定义相应的关系:

php
// app/Models/User.php
namespace AppModels;</p>

<p>use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
use IlluminateDatabaseEloquentRelationsMorphToMany;</p>

<p>class User extends Authenticatable
{
    use Notifiable;</p>

<pre><code>public function likes(): MorphToMany
{
    return $this->morphedByMany(Post::class, 'likeable', 'likes');
}

}

处理点赞逻辑

现在我们可以编写控制器来处理点赞请求了。这里提供两种思路:一种是直接操作数据库,另一种是使用Eloquent ORM提供的便捷方法。

方法一:直接操作数据库

这种方式适合初学者理解底层逻辑:

php
public function likePost($postId)
{
    $post = Post::find($postId);
    $userId = auth()->id();</p>

<pre><code>if ($post->likedBy(auth()->user())) {
    // 如果已经点过赞,则取消点赞
    DB::table('likes')
        ->where('likeable_id', $postId)
        ->where('likeable_type', Post::class)
        ->where('user_id', $userId)
        ->delete();
} else {
    // 否则插入新的点赞记录
    DB::table('likes')->insert([
        'user_id' => $userId,
        'likeable_id' => $postId,
        'likeable_type' => Post::class,
        'created_at' => now(),
        'updated_at' => now(),
    ]);
}

return back();

}

方法二:使用Eloquent ORM

这种方法更加简洁且易于维护:

php
public function likePost($postId)
{
    $post = Post::find($postId);</p>

<pre><code>if ($post->likedBy(auth()->user())) {
    // 如果已经点过赞,则取消点赞
    $post->likes()->where('user_id', auth()->id())->delete();
} else {
    // 否则创建新的点赞记录
    $post->likes()->create(['user_id' => auth()->id()]);
}

return back();

}

前端交互

为了让用户能够方便地进行点赞操作,我们可以在视图中添加一个按钮,并通过AJAX请求来异步提交点赞信息。这样可以避免页面刷新带来的不良体验。

html
<!-- resources/views/posts/show.blade.php --></p>

<div>
    @if(auth()->check())
        <button id="like-button">id }}"
                class="{{ $post->likedBy(auth()->user()) ? 'liked' : '' }}">
            {{ $post->likedBy(auth()->user()) ? '取消点赞' : '点赞' }}
        </button>
    @endif
</div>


document.getElementById('like-button').addEventListener('click', function () {
    const postId = this.getAttribute('data-post-id');

    fetch(`/posts/${postId}/like`, {
        method: 'POST',
        headers: {
            'X-CSRF-TOKEN': '{{ csrf_token() }}'
        }
    }).then(response => response.json())
      .then(data => {
          if (data.success) {
              this.classList.toggle('liked');
              this.textContent = this.classList.contains('liked') ? '取消点赞' : '点赞';
          }
      });
});


<p>

还可以考虑使用Laravel自带的Livewire组件库来简化前后端交互过程,或者借助第三方包如laravel-likable快速集成点赞功能。

通过上述步骤,我们就完成了一个基本但完整的Laravel点赞系统。根据实际需求,您可以在此基础上进一步优化和完善,例如增加点赞数量统计、限制频繁点赞等。

Image

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!cheeksyu@vip.qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有积分奖励和额外收入!
5.严禁将资源用于任何违法犯罪行为,不得违反国家法律,否则责任自负,一切法律责任与本站无关

源码下载