1

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

我有两个我感兴趣的模型:ImageCollection,它们通过HABTM关系关联。通过连接表collections_images在 Image.php 和 Collection.php 中正确设置了关系,并且我在写入或检索数据方面一般没有问题。在 Image 模型中也正确设置了Containable 。

我想做的是在 $this->Image 上运行 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标题与$collection不匹配的图像的Collection数据,但它仍然包括Image数据。

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

为了记录,我也从另一个方向着手:

$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”创建一个模型,并建立与ImageCollection的hasOne关系。然后在CollectionsImage上执行 paginate() ,如下所示:

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

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

4

2 回答 2

1

如果要检索属于特定集合的图像,则意味着您实际上愿意检索具有相关图像的集合。我会做这样的事情:

<?php
    $this->Image->Collection->find('first', array(
      'conditions' => array('Collection.title' => 'Urban'),
      'contain' => array(
        'Image'
      )
    ));
?>
于 2012-01-16T16:27:22.143 回答
0

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

于 2012-07-29T21:23:38.683 回答