0

たとえば、私のModelhas method 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;
}

そのコードは、フィルターが存在する場合にのみ機能し、フィルターに値がない場合、すべてのレコードではなくレコードがありません (すべてのレコードが必要です)。どうすれば改善できますか?

4

1 に答える 1

1

関連するフィルターキーが存在することに依存する ORM where 呼び出しを作成したいようです。次のコードは、あなたが探していることを実行するはずです。それは私にとってはうまくいきます。

Rolekey-name/field-name の区別 ( vs. )が許可されていない場合は、より適切になります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) AND 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();
于 2013-02-12T00:12:19.533 に答える