1. 程式人生 > >【laravel】點贊功能

【laravel】點贊功能

正如尼采所說:其實人跟樹是一樣的,越是嚮往高處的陽光,它的根就越要伸向黑暗的地底。 我們要擁有知識,必須時刻努力,世界上最難的兩個字莫過於“堅持”,如果你克服了自己,就會登上人生的巔峰!

這裡寫圖片描述

下面開始我們今天的學習:

我們以文章點贊為例,建立點讚的路由

//點讚的路由 {post}代表文章id 並用正則限制一下只能為數字
Route::get('/posts/{post}/zan', 'App\Http\Controllers\PostController.php')->where('post', ['0-9+']);

//取消點讚的路由
Route::get('/posts/{post},unzan'
, 'App\Http\Controllers\PostController.php')->where('post', ['0-9+']);

利用migration建立 zans 資料表

php artisan make:migration create_zans_table

我們在 database 資料夾中的 migrations 資料夾下會看見生成的檔案 ,開啟檔案,建立表資料

這裡寫圖片描述

建立如下:

這裡寫圖片描述

使用migrate建立 zans

php artisan migrate

然後我們建立贊模型

php artisan make:model
Zans

Posts 模型中 繫結 Posts 模型和 Zans 模型之間的關係

//關聯使用者贊  相當於 `select * from `zans` where user_id = {$user_id}`
public function zan($user_id)
{
    return $this->hasOne('App\Zans', 'post_id', 'id')->where('user_id' , $user_id);
}

//文章的所有贊
public function zans()
{
    return $this->hasMany('App\Zans'
, 'post_id', 'id'); }

模型關係繫結完畢,接下來在PostController中建立兩個方法 zan() zans()

//使用者點贊 (實際上就是向zans表中插入資料)
public function zan(Posts $post)
{
    $params = [
        //獲取使用者id
        'user_id' => 'Auth::id()', 
        //獲取文章id
        'post_id' => $post->id
    ];
    //firstOrCreate 判斷 `Zans` 表中是否有這個物件,沒有則建立
    Zans::fistOrCreate($params);
    return back();
}


//使用者取消點贊 (刪除之前點讚的記錄)
public function unzan(Posts $post)
{
    //利用Posts的模型關聯關係 查詢到那條記錄並刪除
    $post->zan(Auth::id)->delete();
    return back();
}

文章詳情頁新增贊和取消讚的路由

<div>
     {{--判斷當前使用者是否點贊(點贊顯示取消按鈕,沒有點贊顯示點贊按鈕)--}}
     @if($post->zan(\Auth::id())->exists())
         <a href="/posts/{{ $post->id }}/unzan" type="button" class="btn btn-primary btn-lg">取消贊</a>
     @else
         <a href="/posts/{{ $post->id }}/zan" type="button" class="btn btn-primary btn-lg"></a>
     @endif
</div>

文章列表頁可能還有顯示該文章點讚的次數,可以這樣實現

    //文章列表頁 (該方法為查詢文章列表頁面的方法)
    //我們可以用withCount('模型名')方法來查詢文章的 '贊' 數
    public function index()
    {
        if (Auth::check() == false) {
            return redirect('/login');
        }
        $post = Posts::orderBy('created_at', 'desc')->withCount('zans')->paginate(10);
        return view('post.index', compact('post'));
    }

最後使用 模型名(zans)+'_count' 的格式來渲染

<p class="blog-post-meta">{{ $v->zans_count }} </p>

如果咱首頁我們既想獲取點讚的數量又想獲取評論的數量,我們可以這樣操作

//還是以這個為例 只需要在withCount()方法中用陣列來存放模型名即可 呼叫方法都是使用 `模型名(zans)+'_count'` 的格式來渲染,我們假設 'comment' 為評論模型名
public function index()
    {
        if (Auth::check() == false) {
            return redirect('/login');
        }
        $post = Posts::orderBy('created_at', 'desc')->withCount(['zans', 'comment'])->paginate(10);
        return view('post.index', compact('post'));
    }