首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ORM中创建过滤器?

如何在ORM中创建过滤器?
EN

Stack Overflow用户
提问于 2013-02-12 01:40:32
回答 1查看 141关注 0票数 0

例如,我的Model有方法get_objects,我通过以下来源搜索它们:

代码语言:javascript
运行
复制
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;
}

因此,只有当过滤器存在时,代码才会工作,当过滤器中没有值时,我将不会有任何记录,而是所有记录(然后我想要所有记录),如何使其更好?

EN

回答 1

Stack Overflow用户

发布于 2013-02-12 08:12:20

听起来你想让ORM的调用依赖于相关的筛选键。下面的代码应该能做你想要的,它对我来说是有效的,它能做你想要的吗?

如果它不允许键名/字段名的区别(RoleRoleId),那会更简洁。

application/classes/Model/Object

代码语言:javascript
运行
复制
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();
    }
}

一些例子,首先是所有的对象:

代码语言:javascript
运行
复制
Model_Object::get_objects( array() );

RoleId等于2的所有对象:

代码语言:javascript
运行
复制
Model_Object::get_objects( array('Role' => 2) );

role_id位于(2,3,5)且user_id =1的所有对象:

代码语言:javascript
运行
复制
Model_Object::get_objects( array(
    'Role' => array(2,3,5),
    'User' => 1
) );

请注意,最后一个要求您具备以下条件:

代码语言:javascript
运行
复制
protected static $_filter_map = array(
    'Role' => 'role_id',
    'User' => 'user_id', // where `user_id` is a db field name
    // ...
);

或者将get_objects函数更改/简化为

代码语言:javascript
运行
复制
$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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14817695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档