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查询,因此效率更高。仅因为可以在一个查询中获取数据,并不意味着它是最高效的。