提问者:小点点

CakePHP 3.0在保存时忽略实体访问器


我正在将一个项目从2. x转换到3. x。一周后,我终于开始掌握新的ORM,除了...

我没有很好地尝试在模型中使用afterFind生命周期回调实现曾经很容易实现的功能。

我有一个Files表,其中包含创建的和修改的DATETIME列。我使用蛋糕的时间戳行为在我的FilesTable类。到目前为止,一切正常。

当我试图在文件实体类中使用访问器\u getModified($modified)格式化任一字段时,问题就开始了。当检索已采用正确的DATETIME格式的现有记录时,它可以正常工作,但当我尝试保存任何新记录时,它会尝试保存访问者的格式化版本,而不是时间戳行为的版本,这会导致保存0000-00-00 00:00:00

简而言之:我希望在插入/更新记录时忽略访问器。

这是我的文件实体类:

class File extends Entity {
    protected function _getModified($modified) {
        $today = date("m-d-y");
        $year = date("Y");
        $file_day = date("m-d-y", strtotime($modified));
        $file_year = date("Y", strtotime($modified));

        if( $today === $file_day){
            return 'Today ' . date('g:ia', strtotime($modified)); 
        } else if ($year !== $file_year) {
            return date('M j, Y', strtotime($modified));
        } else {
            return date('M j, g:ia', strtotime($modified));  
        }
    }
}

提前感谢您的帮助!


共1个答案

匿名用户

你应该考虑创建虚拟财产

protected function _getFormattedDate()
{
    // Move here code from _getModified
    // $modified = $this->_properties['modified']
}

删除您的_getModified方法,并让时间戳行为控制modified属性的访问器/变异器

实体

注意:将实体转换为JSON或数组时,必须显式列出应导出到结果的虚拟字段。在这种情况下,将其添加到实体类

protected $_virtual = ['formatted_date'];

实体