手动转换类型实例中的输入参数

manually convert input parameters in type instance

我在将日期值保存在 varchar 字段中时遇到了一些问题。 我正在尝试将输入日期(如 17/06/2015)转换为时间实例,然后将其作为 2015-06-17

存储在我的数据库中

这里是我要保存的实体的例子

(int) 1 => object(App\Model\Entity\Valeur) {
    'new' => true,
    'accessible' => [
        '*' => true
    ],
    'properties' => [
        'caracteristique_id' => (int) 51,
        'caracteristique' => object(App\Model\Entity\Caracteristique) {
            'new' => true,
            'accessible' => [
                '*' => true
            ],
            'properties' => [
                'id' => (int) 51,
                'type' => 'Date'
            ],
            'dirty' => [
                'id' => true,
                'type' => true
            ],
            'original' => [],
            'virtual' => [],
            'errors' => [],
            'repository' => 'Caracteristiques'
        },
        'valeur' => object(Cake\I18n\Time) {
            'time' => '2015-06-03T10:28:53+0000',
            'timezone' => 'UTC',
            'fixedNowTime' => false                             
        }
    ],
    'dirty' => [
        'caracteristique_id' => true,
        'caracteristique' => true,
        'valeur' => true
    ],
    'original' => [],
    'virtual' => [],
    'errors' => [],
    'repository' => 'Valeurs'                       
},

保存后我的数据库中只有 17/06/2015

在视图中使用它时,我只是将其保存为日期时间和格式,但您可以做的是在保存之前(在 beforeSave 或 Controller/model 中)更改值以匹配任何日期你要

假设您的实体名为 valeur,并且您存储日期的字段也是 valeur:

$valeur->valeur = $valeur->valeur->format('Y-m-d');

好吧,我在时间戳行为中找到了答案,所以我在我的实体中这样做了:

protected function _setValeur($valeur)
{
    if (isset($this->caracteristique)) {
        if ($this->caracteristique->isDate()) {
            try {
                if (!($valeur instanceof Time)) {
                    $valeur = Time::createFromFormat('d/m/Y', $valeur);
                }
                return $valeur->format('Y-m-d');
            } catch (\InvalidArgumentException $e) {
                return null;
            }
        }
    }
    if (empty($valeur)) {
        $valeur = null;
    }
    return $valeur;
}

protected function _getValeur($valeur)
{
    if (isset($this->caracteristique)) {
        if ($this->caracteristique->isDate()) {
            try {
                return Time::createFromFormat('Y-m-d', $valeur);
            } catch (\InvalidArgumentException $e) {
                return null;
            }
        }
    }
    return $valeur;
}

protected function _getDate()
{
    if (isset($this->caracteristique)) {
        if ($this->caracteristique->isDate()) {
            return !is_null($this->valeur) ?
                $this->valeur->format('d/m/Y') : $this->valeur;
        }
    }

    return null;
}

字段 valeur 由特征关联动态引用,因此即使在我的数据库中,valeur 的字段在应用程序中是一个 varchar,它可以是日期、字符串或数字。

在这种情况下,我测试了类型,然后在查找时检索了 Time 对象,并在保存时将日期字符串设置为 'd/m/Y' 格式。

我还创建了一个虚拟 属性,它给我格式化的日期