gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:48:24 26 4
gpt4 key购买 nike

我有这样的模型关系:
Project有很多 SubProject有很多 Item
我想设置一个containable数组,以便我可以找到所有 Item属于特定 Project 的 s ,并对结果进行分页。所以,在我的 ItemsController我有:

public $paginate = array(
'Item' => array(
'limit' => 10,
'order' => array('
'Item.create_time' => 'desc'
),
'contain' => array(
'SubProject' => array(
'Project'
)
)
)
);

显然,我需要在某个地方放置一个条件,如 "SubProject.project_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
.....

编辑 :省略不匹配的项目记录是完全正确的;我想跳过没有匹配项目记录的任何项目记录。

我想到了 manually specify my joins ,但我觉得这不应该是必要的。

看起来这应该是显而易见的,但是,解决方案让我无法理解。

最佳答案

我最终确实解决了这个问题,所以我想我会解释我做了什么,希望它可以帮助别人。

看完this blog post by Mark Story (从 1.2 开始,但仍然相关)我决定要做的是在我的 Item 模型中创建一个自定义查找类型,直接绑定(bind) Project 模型。这给出了 Containable 可以正确过滤的第一级关联。

所以,在 Items 模型中,我有类似下面的内容(参见 the documentation 关于自定义查找类型)。

public $findMethods = array('byProject' => true);

public function _findByProject($state, $query, $results=array()) {
if ($state == 'before') {
$this->bindModel(array(
'hasOne' => array(
'Project' => array(
'foreignKey' => false,
'conditions' => array('Project.id = SubProject.project_id')
)
)
));
return $query;
}
return $results;
}

注意设置 foreignKey为 false 是防止 CakePHP 尝试自动使用不存在的数据库键所必需的。在 ItemsController 中,分页选项现在如下所示:
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。 View 代码中的一些细微调整以适应略有不同的结果数组结构,我已经准备好了。

关于CakePHP 2.x 深度关联上的可包含行为条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14528492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com