CakePHP 2.x包含深度关联的行为条件

CakePHP 2.x包含深度关联的行为条件,cakephp,Cakephp,我有这样的模型关系: Array ( [0] => Array ( [Item] => Array ( [id] => 13 [file_name] => foo.tar.gz .... other keys ... [create_time] => 2013-01-23 14:59:49

我有这样的模型关系:

Array
(
[0] => Array
    (
        [Item] => Array
            (
                [id] => 13
                [file_name] => foo.tar.gz
                .... other keys ...
                [create_time] => 2013-01-23 14:59:49
                [subProject_id] => 4
            )

        [SubProject] => Array
            (
                [id] => 4
                [name] => foo
                [project_id] => 2
                ..... other keys ....
                [Project] => Array
                    (
                    )

            )

    )
 [1] => Array
 .....
public $paginate = array(
    'Item' => array(
        'findType' => 'byProject',
        'limit' => 10,
        'order' => array(
            'Item.create_time' => 'desc'
        ),
        'contain' => array(
            'SubProject',
            'Project'
        ),
        'conditions' => array('Project.id' = $pid)
    ),
);
项目
hasMany
子项目
hasMany
项目

我想设置一个可包含的
数组,以便找到属于特定
项目的所有
,并对结果进行分页。因此,在我的
ItemsController
中,我有:

public $paginate = array(
  'Item' => array(
    'limit' => 10,
    'order' => array('
      'Item.create_time' => 'desc'
    ),
    'contain' => array(
      'SubProject' => array(
        'Project'
      )
    )
  )
);
显然,我需要在某个地方设置一个条件,比如
“SubProject.project\u id=$pid”
,但我尝试过的结果都不正确。我能管理的最好结果如下所示:

Array
(
[0] => Array
    (
        [Item] => Array
            (
                [id] => 13
                [file_name] => foo.tar.gz
                .... other keys ...
                [create_time] => 2013-01-23 14:59:49
                [subProject_id] => 4
            )

        [SubProject] => Array
            (
                [id] => 4
                [name] => foo
                [project_id] => 2
                ..... other keys ....
                [Project] => Array
                    (
                    )

            )

    )
 [1] => Array
 .....
public $paginate = array(
    'Item' => array(
        'findType' => 'byProject',
        'limit' => 10,
        'order' => array(
            'Item.create_time' => 'desc'
        ),
        'contain' => array(
            'SubProject',
            'Project'
        ),
        'conditions' => array('Project.id' = $pid)
    ),
);
编辑:完全正确地省略了不匹配的项目记录;我想跳过没有匹配项目记录的任何项目记录

我突然想到要去,但我觉得没必要

这似乎应该是显而易见的,但是,唉,我没有想到解决办法。

EDIT===============

public $paginate = array(
    'limit' => 10,
    'order' => 'Item.create_time DESC',      //'order' => array(''Item.create_time' => 'desc'),
    'contain' => array(
        'SubProject' => array(
            'Project' => array(
                'conditions' => array(
                    'id' => $project_id    // Passed parameter
                )
            )
        )
     )
);
=================================================

public $paginate = array(
    'limit' => 10,
    'order' => 'Item.create_time DESC',      //'order' => array(''Item.create_time' => 'desc'),
    'contain' => array(
        'SubProject' => array(
            'Project' => array(
                'conditions' => array(
                    'id' => $project_id    // Passed parameter
                )
            )
        )
     )
);
您是否尝试过使用以下
条件
?此外,我没有像您那样编写代码的“顺序”部分

public $paginate = array(
    'Item' => array(
        'limit' => 10,
        'order' => 'Item.create_time DESC',      //'order' => array(''Item.create_time' => 'desc'),
        'contain' => array(
            'SubProject' => array(
                'Project' => array(
                    'conditions' => array(
                        'id' => $project_id    // Passed parameter
                    )
                )
            )
        )
     )
);

我最终解决了这个问题,所以我想我应该解释一下我所做的,希望它能帮助其他人

在阅读之后(这是从1.2开始的,但仍然相关),我决定要做的事情是在我的项目模型中创建一个定制的find类型,直接绑定项目模型。这提供了Containeble可以正确过滤的第一级关联

因此,在Items模型中,我有如下内容(请参见关于自定义查找类型)

请注意,必须将
foreignKey
设置为false,以防止CakePHP尝试自动使用不存在的数据库密钥。在ItemsController中,分页选项现在如下所示:

Array
(
[0] => Array
    (
        [Item] => Array
            (
                [id] => 13
                [file_name] => foo.tar.gz
                .... other keys ...
                [create_time] => 2013-01-23 14:59:49
                [subProject_id] => 4
            )

        [SubProject] => Array
            (
                [id] => 4
                [name] => foo
                [project_id] => 2
                ..... other keys ....
                [Project] => Array
                    (
                    )

            )

    )
 [1] => Array
 .....
public $paginate = array(
    'Item' => array(
        'findType' => 'byProject',
        'limit' => 10,
        'order' => array(
            'Item.create_time' => 'desc'
        ),
        'contain' => array(
            'SubProject',
            'Project'
        ),
        'conditions' => array('Project.id' = $pid)
    ),
);

…其中,
$pid
是要显示的项目的id。在视图代码中进行了一些小的调整,以适应略有不同的结果数组结构,我已经准备好了。

除了我在问题中提到的
有许多
关系(以及相关的
属于
关系)之外,模型实际上什么都没有。为什么不找到带有$pid的子项目,然后提取$subpid呢(可能是使用Set::extract),然后用$subpid对项目进行分页?我想这是可能的,但这不是Containable设计的那种搜索吗?是的,这是我尝试过的许多事情之一(我只是再次检查了一下)。结果仍然包括所有
项目
条目,正如我在问题中解释的那样(为了清晰起见,我将编辑该部分).好的…也许你不应该在这里包含
,因为你是从
项控制器
函数调用它的…我将用我的意思更新我的答案没有任何区别,正如它所说,将模型名包含为顶级键是有效的,因此你可以为多个模型设置分页选项。+1帮助我精简通过这一点,我真的很感激。最终解决方案有些不同。我将其作为另一个答案发布。感谢发布解决方案。需要从中学习其他内容!
foreignKey false
,因为您使用了hasOne。如果您使用belongsTo,则无需指定密钥或条件,因为
>project_id
是默认的keyGood point。此外,我应该提到,这还有一个额外的好处,即查找只生成一个SQL查询,因此效率更高。仅因为可以在一个查询中获取数据,并不意味着它是最高效的。