【问题标题】:Lots of queries to pull up user photos and their comments. (CakePHP)很多查询可以提取用户照片和他们的评论。 (CakePHP)
【发布时间】:2009-11-04 15:54:22
【问题描述】:

我正在尝试使用配置文件的 cmets 提取配置文件信息。我得到了预期的一切。没有返回错误,数组格式完美。我关心的是正在运行的查询。它为每个 ID 运行一个查询以获取其照片(查询的开头在下面代码中的 cmets 中注明)。我想这是通过 user_id 获取照片的唯一方法?全部在单独的查询中?有没有更好的办法?

我正在描绘一个包含 40 多个 cmets 的个人资料,这令人恐惧。这就是 memcached 的用武之地吗?

$profile = $this->Profile->find('first', array(
                            'conditions' => array('Profile.url' => $url),
                            'contain' => array(
                                    'User' => array(
                                            'fields' => array(
                                                    'User.id','User.name'
                                            ),
                                            'Photo' => array(
                                                    'fields' => array(
                                                            'Photo.thumbnail','Photo.image'
                                                    )
                                            )
                                    ),
                                    'Comment' => array(
                        'User' => array(
                            'fields' => array(
                                'User.name'
                            ),
                            'Photo' => array( // right here
                                'fields' => array(
                                    'Photo.thumbnail'
                                )
                            )
                        )
                    )
                            )
                    )); 

编辑:

我显然有一个用户表,以及一个评论表。我还有一个存储用户图像 URL 的照片表,外键 = user_id。因此,当我从特定配置文件中查询所有评论时,它是 Comment.user_id,我还需要通过其 user_id 从照片表中获取 Photo.thumbnail。

【问题讨论】:

    标签: php sql cakephp mysql


    【解决方案1】:

    使用 LEFT JOIN 可以加快速度。

    编辑代码已被编辑以更好地回答问题(需要两个左连接 - 不是一个)。

    SELECT c.text, i.profiles, p.photo_url
    FROM comments AS c
    LEFT JOIN profiles AS i on c.profile_id = i.id
    LEFT JOIN photos AS p ON i.id = p.user_id
    WHERE c.post_id = 32
    LIMIT 20
    

    这只是一个通用 SQL,但会:

    1. 根据第 32 条拉取所有 cmets(在 cmets 表中)
    2. 将与评论发布者 ID 匹配到评论的配置文件表左连接
    3. 拉前 20 cmets

    只需一个查询,您就可以提取所有 30 个 cmets 及其相关配置文件。

    希望对你有帮助!

    【讨论】:

    • 嗨,弗兰基,感谢您的回复。我想我需要更清楚地解释我的情况。我显然有一个用户表,以及一个评论表。我还有一个存储用户图像 URL 的照片表,外键 = user_id。因此,正如您所说,当我从特定“文章”查询所有评论时,我还需要通过其 user_id 从照片表中获取 Photo.thumbnail。很抱歉造成混淆,我将编辑我的原始帖子,以便其他人更清楚。
    • 太棒了!谢谢!还有一件事。我为我的应用程序编辑了一些查询,但是当我查询 cmets 时,我也在尝试获取用户名,所以我尝试了:SELECT c.content, c.created, c.modified, p.thumbnail, u.name FROM cmets AS c LEFT JOIN profiles AS i ON c.profile_id = i.id LEFT JOIN photos AS p ON i.id = p.user_id LEFT JOIN users AS u ON p.user_id = u.id WHERE c.profile_id = 1 但它显示相同的 u.name 和相同的 p.thumbnail。非常感谢您的帮助。
    • 知道了:SELECT c.content, c.created, c.modified, p.thumbnail, u.name FROM cmets AS c LEFT JOIN profiles AS i ON c.profile_id = i.id LEFT JOIN users AS u ON c.user_id = u.id LEFT JOIN photos AS p ON u.id = p.user_id WHERE c.profile_id =1 感谢您朝着正确的方向推动。我真的需要深入学习 SQL。 ://
    • 谁能告诉我这个蛋糕的做法?虽然自定义查询很棒,但我想看看是否有 CakePHP 方法可以做到这一点。如果我没有为此使用 Cake 的 ORM,我还不如使用 CI。
    【解决方案2】:

    您可以将数组键“包含”替换为数组键“链接”,它会为您构建左连接 - 请参阅linkable behavior。缺点是所有关联的关系必须从 hasOne 或 hasMany 到 belongsTo 关系。

    【讨论】:

    • 我今天早些时候发现了 Linkable 行为。只是无法让它以我想要的方式工作。在直接关系中拉表很好。但是一旦它开始超出递归级别 1,它就会崩溃,我没有得到任何结果。也许我做错了什么。在我继续之前已经尝试了好几天,因为这种类型的查询类似于我将在这个 Web 应用程序中运行的其他查询。郁闷!!
    【解决方案3】:

    您可能还想查看 Nate 在 Bakery 中关于“蛋糕方式”进行连接的文章。

    http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多