鍍金池/ 問答/PHP  Python  數(shù)據(jù)庫/ 如何類似youtube記錄按贊的用戶并顯示按贊與否?

如何類似youtube記錄按贊的用戶并顯示按贊與否?

請問類似像youtube頁面可以顯示你是否按過like或dislike這種的資料庫欄位是如何設(shè)計的?并在用戶到達該頁面時去資料庫判斷出來?

我想的是否設(shè)計理念是這樣

Post table
id picroute likeusers dislikeusers
1 img/0001.jpeg {1,3,4,6,11,44,233} {2,5,8,15,66,77,88}

在一個 欄位里面 就放進去了 以點選like的userid

請問這樣的填法類似分隔號的用什么語法去一個個填在該欄位尾端嗎?

在讀取實是否可以在資料庫處理語法就去讀去比如說 likeusers是否有 11這個userid 而不用去將整個 likerusers 這個欄位從資料庫取出然后再去用類似篩癬的進行php或javascript處理?

另外可否用sql語法去新增和刪除某個userid不是整個欄位取出后 刪除 在整個欄位用更新放回欄位?

可能有人想說我為何不考慮整個table 但是我覺得一個youtube一個文章有l(wèi)ike dislike的就去制造一個table去容納已經(jīng)點選like的userid 也制造太多table了吧!

所以想要達到的效果是

一個頁面里面有多個圖片比如說九個圖片
每個圖片上面都有一個like和dislike 的鈕和顯示數(shù)字

當用戶進到這個頁面 去資料庫取出 就各圖片的連接src 然后將用戶的userid 去比對每個 post table里面的 單一個id的 userlike陣列里面是否有該userid

若likeusers有該userid的話 顯示已按like不能點選了 但是dislike可以點選的狀態(tài)
反過來亦然
然后如果兩個欄位都沒有userid的話 那就like和dislike都顯示可以選取的狀態(tài)

不知道這樣的設(shè)計理念是可以的嗎?還是有哪種方式可以實現(xiàn)呢?
我想要知道后用laravel寫出來 但是現(xiàn)在還不知道可以用什么sql語法
去將userid寫入同一個欄位或查訓在同一個欄位是否有該userid還有如何去個別刪除 增加某個userid?

回答
編輯回答
溫衫

就是類似于sf這種投票、反對的功能吧?如果是我來做的話,我會這樣搞:

id     article_id user_id   is_like
自增ID   文章ID     用戶ID    是否喜歡(1喜歡0不喜歡)

如上是表的數(shù)據(jù)結(jié)構(gòu),應(yīng)該符合你的功能需求;
而且取值、查詢也方便;

laravel中如何操作不清楚,但是如果你的欄位非要存1,2,3,4,5這種數(shù)據(jù)結(jié)構(gòu)的話,那么原生的mysql可以采用find_in_set函數(shù)來操作;

2017年6月29日 11:52
編輯回答
維他命

建議先熟悉下文檔,在laravel里面要達到類似的需求是非常容易的,使用一下多對多關(guān)聯(lián)就可以了。
先建立相應(yīng)的模型和表:
User模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    //
}

users表

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('username')->unique()->nullable();
    $table->string('password')->nullable();
    $table->rememberToken();
    $table->timestamps();
});

Post模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
}

posts表

Schema::create('posts', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('user_id')->index();
    $table->string('path');

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->timestamps();
});

然后在模型中添加相應(yīng)的關(guān)聯(lián),前面也說了點贊這種適合使用多對多關(guān)聯(lián)
User模型

public function likes(){
    return $this->belongsToMnay('App\Models\Post');
}

Post模型

public function liked_users(){
    return $this->belongsToMany('App\Models\User');
}

這時候在控制器中只要調(diào)用如下方法就可以了:

// 點贊
$user->likes()->attach($post_id);
// 取消點贊
$user->likes()->detach($post_id);
// 獲取用戶點贊的圖片
$user->likes;
// 分頁獲取用戶點贊的圖片
$user->likes()->paginate(10);
// 判斷用戶是否喜歡某圖片
$user->likes()->where('post_id',$post_id)->exists();
// 獲取某圖片的點贊用戶
$post->liked_users;

更多關(guān)于多對多的用法請查看文檔
https://laravel-china.org/doc...

2017年3月4日 07:32
編輯回答
青裙

這種東西不都是用 Redis 來實現(xiàn)的嗎?
Redis 的 INCR 命令正好用來做這個。

2017年12月3日 13:44