有没有办法在执行任何插入/更新时将codeigniter默认设置为将timepan和user_id插入表中的特定列?
我在数据库中有8个表,都包含(update_time,updated_by)列,我想设置codeigniter活动记录,以便在发生更新/插入时自动填充update_time=time() and update_by=$this->session->userdata('user')->id;
同样在同一个概念上我想破解删除操作到更新列(archived)= 1而不是删除(因为我的mysql用户还没有删除记录访问权限)
有可能吗?
答案 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的所有子类使用。