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

时间:2015-06-17 10:42:32

标签: cakephp-3.0

我在varchar字段中保存日期值有些问题。 我试图将输入日期(如17/06/2015)转换为Time实例,然后将其存储在我的数据库中,如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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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的字段是app中的varchar,它也可以是日期,字符串或数字。

在这种情况下,我测试类型,然后我只是在find上检索Time对象,并设置为日期字符串,格式为' d / m / Y'当我拯救。

我还创建了一个虚拟属性,为我提供了格式化日期