使用codeigniter和datamapper过滤结果集

时间:2011-11-02 12:27:21

标签: codeigniter filter resultset codeigniter-datamapper

我遇到了datamapper的一个小问题,我想知道是否有快速解决方案。 假设我有这种数据

群组表

id   |   Name
1    |   admin
2    |   guest
3    |   editor
4    |   moderator

在我的基本控制器中,我设置了一个全局字段,仅查看非管理员组

$this->groups_ = new Group();
$this->groups_->where('id >', 1)->get();

//so I can select the users that are not admin
$users = new User();
$users->where_related('group',$id,$this->groups_)->get();

现在在我的控制器中我想过滤这些组。例如,我想只选择编辑器和访客(id在1到4之间)。所以我想过滤初始结果集......像这样

$this->groups_->where('id <',4)->get();

但它不起作用。它返回所有组ID&lt; 4包括管理员。 什么是正确的方法来获得这个?

2 个答案:

答案 0 :(得分:0)

嗯,datamapper不查询对象或对象组。它查询数据库。因此,当您执行第二个get()时,您正在对数据库执行单独的查询。

您可以执行此操作,但这将是一个额外的查询:

$this->groups_->where('id >', 1)->where('id <', 4)->get();

或者你可以在php中第一次查询后循环遍历$this->groups_并过滤那里的集合并保存为数组。

答案 1 :(得分:0)

可能的解决方案

也许我找到了cloning the datamapper object可能的解决方法。 我想要做的不是多次查询数据库,但我希望有一个基本结果集并优化结果。

所以在我的基本控制器中我会做类似

的事情
$this->groups_ = new Group();
$this->groups_->where('id >', 1);//without getting the results

//so I can select the users that are not admin
$users = new User();
//here i'm getting the results from the clone
$users->where_related('group',$id,$this->groups_->get_clone()->get())->get();

而且,当我离开对象“打开”,没有得到结果时,我可以在我的控制器中使用它,作为我的其他“查询”的基础......好吧,它们实际上是第一个查询的新条件

//now the query return the groups between 2, as I set in the base controller
//and 4, set in the child controller
$this->groups_->where('id <',4)->get();