检查用户是否已收藏某个项目

时间:2014-05-02 08:47:14

标签: php mysql

我正在尝试构建一个允许用户添加或删除收藏中的项目的系统。我是从this post开始的,所以我以这种方式创建了一个连接表(我保留了原来的OP&#39的项目):

CREATE TABLE user_favorites (
  user_id INT NOT NULL,
  movie_id INT NOT NULL,
  PRIMARY KEY (user_id, movie_id),
  FOREIGN KEY (user_id) REFERENCES users (user_id),
  FOREIGN KEY (movie_id) REFERENCES movies (movie_id)
)

在我自己的项目中,我回应了几部不同的电影"在页面上:

try{
    $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
    $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

    $query="SELECT * FROM movies";
    $res=$con->query($query);
    $movies=$res->fetchAll(PDO::FETCH_ASSOC);
    return $movies; 
}

catch(PDOException $e){
    echo 'Error : '.$e->getMessage();
}

然后我将它们格式化以满足我的需要并在页面上回显它们:

echo (formatMovies($movies));

(formatMovies基本上是一个循环遍历所有项目并构建必要HTML的foreach。)

但事情就是这样:我想根据用户是否对它们进行收藏,对电影应用不同的风格。

我的问题是:检查用户是否喜欢这部电影的最佳方法是什么?何时应该这样做?我应该在formatMovies循环中这样做,这意味着我会为$ movies中的每个项目发送一个额外的查询吗?这对我来说似乎效率很低。

谢谢大家!

1 个答案:

答案 0 :(得分:1)

您可以使用连接...在单个查询中执行此操作...

$query = $con->prepare("
    SELECT m.*, f.movie_id IS NOT NULL AS has_favorited
    FROM movies AS m
    LEFT JOIN user_favorites AS f ON(f.user_id = :userId AND m.movie_id = f.movie_id)
");

$query->execute(array(':userId' => $userId));
$movies = $query->fetchAll(PDO::FETCH_ASSOC);

然后在你的循环中,只需检查if($movies['has_favorited']),然后你就会知道它是否被收藏。