【问题标题】:Check if user has favorited an item检查用户是否收藏了一个项目
【发布时间】:2014-05-02 08:47:14
【问题描述】:

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

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 中的每个项目发送一个额外的查询?这对我来说似乎效率很低。

谢谢大家!

【问题讨论】:

    标签: php mysql


    【解决方案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']),然后你就会知道它是否被收藏了。

    【讨论】:

    • 您好,感谢您的回答!但是我已经尝试过了,它返回一个错误:SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'user_id' in on clause is ambiguous。我肯定做错了什么?
    • @RobertS。 "ON(f.user_id"
    • @RobertS。我已经按照草莓的建议更新了答案。问题是我没有指定哪个表,但我又一次认为你不会在电影表中有 user_id 列。
    猜你喜欢
    • 2014-02-17
    • 1970-01-01
    • 2011-07-05
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多