全局创建者,任何插入查询的时间跨度

时间:2013-03-09 20:38:56

标签: php mysql codeigniter codeigniter-2

有没有办法在执行任何插入/更新时将codeigniter默认设置为将timepan和user_id插入表中的特定列?

我在数据库中有8个表,都包含(update_time,updated_by)列,我想设置codeigniter活动记录,以便在发生更新/插入时自动填充update_time=time() and update_by=$this->session->userdata('user')->id;

同样在同一个概念上我想破解删除操作到更新列(archived)= 1而不是删除(因为我的mysql用户还没有删除记录访问权限)

有可能吗?

2 个答案:

答案 0 :(得分:1)

如果您想破解CI来完成此任务,您应该查看system / drivers / DB_Active_rec.php(假设您使用CI中的活动记录功能)

例如,您可以通过修改该文件中的更新方法在更新中插入当前时间。改变这个:

public function update($table = '', $set = NULL, $where = NULL, $limit = NULL)
{
    // Combine any cached components with the current statements
    $this->_merge_cache();

    if ( ! is_null($set))
    {
        $this->set($set);
    }
            [...]

成:

public function update($table = '', $set = NULL, $where = NULL, $limit = NULL)
{
    // Combine any cached components with the current statements
    $this->_merge_cache();

    // start of Insert updated_time hack
    $time_format = 'Y-m-d H:i:s';
    $set['update_time'] = date($time_format);
    // end of hack

    if ( ! is_null($set))
    {
        $this->set($set);
    }
            [...]

答案 1 :(得分:0)

插入或更新记录时,您可以使用现有的functionality of mysql自动更新update_time列。但是,更新user_id是您必须从应用程序手动执行的操作。

您的其他要求通常被某些人称为软删除,您可以通过在列上转动标记将行标记为已删除。这是可能的,但您必须确保所有选择和更新查询都避免打开此标志的行。

最好仔细构建Model方法以遵守应用程序的这两个要求。您也许可以使用extending the core Model CI来定制更新/选择查询,这些查询将被扩展为MY_Model的所有子类使用。