Kohana ORM更改时区选择


Kohana ORM change timezone on select

是否可以使用不同的时区从数据库中进行选择?我在我的表中得到了一些记录,它们的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)),
            ),
        );
    }
}

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

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

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

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);

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