CakePHP - 将一个模型的结果限制为相关模型中具有匹配条件的模型

时间:2012-01-04 21:23:13

标签: cakephp containable contain

我刚开始使用CakePHP,并且遇到了将检索到的结果限制在相关模型中的字段与某个值匹配的问题。我在这里和其他地方发现了很多相关的问题,但它们似乎处理的情况要比我的情景更复杂或更简单,所以我们走了:

我有两个我感兴趣的模型:图像集合,它们与 HABTM 关系相关联。通过连接表 collections_images 正确地在Image.php和Collection.php中设置关系,并且我一般没有编写或检索数据的问题。 可包含也可在图像模型中正确设置。

我想要做的是在$ this->图片上运行find(),并仅返回属于特定集合的标题为 $ collection 的集合。我尝试了几种不同的方法:

$this->Image->contain("Collection"); // to exclude other models "Image" is related to

pr($this->Image->find("all", 
                       array("conditions" => array("Collection.title" => $collection))
                      ));

为此,我收到以下错误:

  
    

错误:SQLSTATE [42S22]:找不到列:1054'where子句'中的未知列'Collection.title'

  

您似乎无法通过相关模型直接建立搜索条件,因此我回过头来尝试限制包含,如下所示:

$this->Image->contain(array(
                          "Collection" => array(
                              "conditions" => array(
                                  "Collection.title" => $collection))));

pr($this->Image->find("all"));

这次我得到了结果,但它们包含了不属于正确集合的图片。这是一个简化的片段,pr()给我 $ collection =“Urban”

[3] => Array
    (
        [Image] => Array
            (
                [id] => 39
                [title] => Star Trails over Greenlake
            )

        [Collection] => Array
            (
            )
    )

[4] => Array
    (
        [Image] => Array
            (
                [id] => 40
                [title] => Aurora Bridge and Reflections

            )

        [Collection] => Array
            (
                [0] => Array
                    (
                        [id] => 3
                        [title] => Urban
                        [CollectionsImage] => Array
                            (
                                [id] => 62
                                [collection_id] => 3
                                [image_id] => 40
                            )

                    )

            )

    )

正如您所看到的,它忽略了图片收藏数据,其中收藏标题与 $ collection <不匹配/ strong>,但它仍然包含图像数据。

我在这里缺少什么?有没有办法让这两种方法中的任何一种都能达到我的目标?

为了记录,我也从另一个方向走了出来:

$this->Collection->find("all", array("conditions" => array("Collection.title" => $collection)))

只返回所需的数据。但是,它返回的数据的数组结构在我的代码中的其他地方产生了复杂性,我希望最终能够直接从 Image 分页。

感谢您的时间和帮助,每个人。

修改

经过额外搜索后,我在这里找到了一个可接受的解决方案:

http://cakebaker.42dh.com/2007/10/17/pagination-of-data-from-a-habtm-relationship/

这要求我为映射表“CollectionsImage.php”创建一个模型,并与图像建立 hasOne 关系和收藏。然后在 CollectionsImage 上执行paginate(),如下所示:

$data = $this->paginate("CollectionsImage", array("Collection.id" => $collection_id));

这似乎有点迂回,需要一个额外的步骤让我找到具有指定标题的集合的ID,所以我仍然想知道是否有人知道更直接的解决方案。

2 个答案:

答案 0 :(得分:1)

如果要检索属于特定集合的图像,则表示您实际上愿意使用其相关图像检索集合。我会做这样的事情:

<?php
    $this->Image->Collection->find('first', array(
      'conditions' => array('Collection.title' => 'Urban'),
      'contain' => array(
        'Image'
      )
    ));
?>

答案 1 :(得分:0)

我写了一篇关于HABTM模型和CakePHP细微之处的文章。您可能会觉得值得:http://www.24100.net/2012/07/cakephp-hasandbelongstomany-relationship-queries-demystified/