我遇到了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包括管理员。 什么是正确的方法来获得这个?
答案 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();