例如,我的Model有方法get_objects,我通过以下来源搜索它们:
class Model_Object extends ORM {
public function get_objects($filters = array())
{
if (!empty($filters['Role']))
$role = $filters['Role'];
else
$role = NULL;
$objects = ORM::factory('object')
->where('RoleId','=',$role)
->find_all();
return $objects;
}因此,只有当过滤器存在时,代码才会工作,当过滤器中没有值时,我将不会有任何记录,而是所有记录(然后我想要所有记录),如何使其更好?
发布于 2013-02-12 08:12:20
听起来你想让ORM的调用依赖于相关的筛选键。下面的代码应该能做你想要的,它对我来说是有效的,它能做你想要的吗?
如果它不允许键名/字段名的区别(Role与RoleId),那会更简洁。
application/classes/Model/Object
class Model_Object extends ORM {
// Map from filter key names to model field names
protected static $_filter_map = array(
'Role' => 'RoleId',
// ...
);
public static function get_objects($filters = array())
{
$objects = ORM::factory('object');
foreach($filters as $key => $value)
{
if ($field = Arr::get(self::$_filter_map, $key))
{
$operator = (is_array($value)) ? 'IN' : '=';
$objects->where($field, $operator, $value);
} else {
throw new Kohana_Exception(
'Unknown filter key :key',
array(':key' => $key)
);
}
}
return $objects->find_all();
}
}一些例子,首先是所有的对象:
Model_Object::get_objects( array() );RoleId等于2的所有对象:
Model_Object::get_objects( array('Role' => 2) );role_id位于(2,3,5)且user_id =1的所有对象:
Model_Object::get_objects( array(
'Role' => array(2,3,5),
'User' => 1
) );请注意,最后一个要求您具备以下条件:
protected static $_filter_map = array(
'Role' => 'role_id',
'User' => 'user_id', // where `user_id` is a db field name
// ...
);或者将get_objects函数更改/简化为
$objects = ORM::factory('object');
foreach($filters as $key => $value)
{
$field = Arr::get(self::$_filter_map, $key, $key);
$operator = is_array($value) ? 'IN' : '=';
$objects->where($field, $operator, $value);
}
return $objects->find_all();https://stackoverflow.com/questions/14817695
复制相似问题