0

是否可以使用不同的时区从数据库中进行选择?我的表中有一些记录,他们的time列是 GMT 时区的时间戳。例如,我想从中获取所有记录30-05-2013。使用 PST 时区。

我用谷歌搜索了一下,发现如果我正在运行这个查询:

SET time_zone = 'America/Los_Angeles';

在每次查询之前它应该工作(如果我错了,请纠正我)。

但是我可以用 Kohana ORM 做什么?

这是我的模型:

class Model_Calls extends ORM {

    protected $_table_name = 'pbxlog';
    protected $_has_many = array('user' => array('model' => 'user'));

    public function rules()
    {
        return array(
            'logtime' => array(
                array('not_empty'),
            ),
            'user_id' => array(
                array('not_empty'),
            ),
            'customer' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'server' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'callid' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'uniqueid' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'state' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'src_type' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'src_number' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'src_customer' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'dst_type' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'dst_number' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'dst_customer' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'called_type' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
            'called_number' => array(
                array('not_empty'),
                array('min_length', array(':value', 1)),
                array('max_length', array(':value', 128)),
            ),
        );
    }
}
4

1 回答 1

1

不容易但可行(虽然没有测试)。
1.你应该get_connection()在类中添加方法Database(直接放在你的application/classes/文件夹中,文件名应该是database.php):

class Database extends Kohana_Database 
{
   public function get_connection()
   {
      return $this->_connection;
   }
}

__construct()2. 你应该在你的模型中覆盖方法:

class Model_Calls extends ORM {
public function __construct($id = NULL, $timezone = NULL)
{
    $this->_initialize();

    // ADDED
    if ($timezone)
    {
        $this->_db->get_connection()->exec('SET time_zone = ' . $this->_db->quote($timezone));
    }
    // END ADDED

    if ($id !== NULL)
    {
        if (is_array($id))
        {
            foreach ($id as $column => $value)
            {
                // Passing an array of column => values
                $this->where($column, '=', $value);
            }

            $this->find();
        }
        else
        {
            // Passing the primary key
            $this->where($this->_object_name . '.' . $this->_primary_key, '=', $id)->find();
        }
    }
    elseif (!empty($this->_cast_data))
    {
        // Load preloaded data from a database call cast
        $this->_load_values($this->_cast_data);

        $this->_cast_data = array();
    }
}

现在您可以像这样加载您的记录:

$res = ORM::factory('call', NULL, 'America/Los_Angeles')->get_all_calls_I_need(xxxxx);

请注意,当您使用查询生成器调用时,这将不起作用。
在这种情况下,您需要在执行正确的查询之前手动设置 time_zone。

于 2013-06-03T09:59:32.913 回答