我正在尝试构建一个允许用户添加或删除收藏中的项目的系统。我是从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中的每个项目发送一个额外的查询吗?这对我来说似乎效率很低。
谢谢大家!
答案 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'])
,然后你就会知道它是否被收藏。