【问题标题】:Find record of one type with more than one associated HABTM type查找具有多个关联 HABTM 类型的一种类型的记录
【发布时间】:2012-12-28 16:47:36
【问题描述】:

我的 CakePHP 应用程序中有两个模型:NewsArticleImageImageNewsArticle 使用 HABTM(拥有并属于许多)关联,因此作者可以根据需要为文章建立图库。

在我的应用程序主页上,我想显示头条新闻,它只是最新发表的文章,并带有至少一张相关图像。我将如何在我的控制器中形成这种情况?到目前为止,我有:

<?php
$topStory = $this->NewsArticle->find('first', array(
    'order' => array(
        'NewsArticle.created' => 'desc'
    )
));

但我不确定如何“计算”附加到我的 NewsArticle 模型的 Image 记录数。

【问题讨论】:

    标签: cakephp model cakephp-2.0 model-associations


    【解决方案1】:

    如果您必须使用 HABTM,则需要进行 JOIN(请参阅 CakePHP Joins)。

    原因是,正常的find()s 实际上会进行单独的查询,然后 CakePHP 会将数据放在一起,然后再返回给您。如果您试图通过子结果的存在来限制主要结果,则需要使用 JOIN。

    如果您能够改用 HasMany(意思是 ImagebelongToNewsArticle),您可以使用 CakePHP's counterCache

    【讨论】:

    • 谢谢。如果我想在多篇文章中使用一张图片,我可能不会放弃hasMany 关系,如果我说,将来为作者介绍一个图片库。
    • 帮助我进行 RTFM!阅读 CakePHP 食谱中关于连接的部分,最终得出了这个解决方案:gist.github.com/4401761。感谢您将我指向加入。
    【解决方案2】:

    为 HABTM 连接表创建 CakePHP 模型通常是明智的,然后您可以查询该表。

    NewsArticle 会有一个名为 news_articles 的表。 Image 会有一个名为 images 的表。所以连接表很可能是 news_articles_images。

    我建议您使用不同于连接表的别名创建模型。以防出现问题。所以你可以做这样的事情。

    class Gallery extends AppModel
    {
         var $name = 'Gallery';
         var $useTable = 'news_articles_images';
         var $belongsTo = array('NewsArticle','Image');
    }
    

    然后在您的控制器中,您可以轻松找到第一篇有图片的文章。

    $topStory = $this->Gallery->find('first',array('order'=>array('NewsArticle.created'=>'DESC'));
    

    【讨论】:

    • 您提到创建一个实际上是连接别名的新模型。 CakePHP 是否在内部创建“桥”模型,如果是,我是否可以实际查询 那个 伪模型而不是创建自己的?
    • @MartinBean 是的,它确实在内部创建了一个。它的名称将是连接表的名称,但不会配置任何 $belongsTo 关联。此外,我不建议创建与此内部文件同名的 Model.php 文件。 Cake 不会总是使用你创建的那个。
    • 获取内部模型的一个实例 - CakeRegistry::init('NewsArticlesImages');或基于连接表名称的东西。
    • 这被称为“hasMany Through”,在 Cake Book 中。
    • @MathewFoscarini - 我们都去过那里,没什么大不了的 :) 我不确定这是否是 CakePHP 特有的术语,但是 - 这是链接:book.cakephp.org/2.0/en/models/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多