Cakephp3中带有大写字母的型号名称的不同输出

时间:2016-06-09 04:31:23

标签: cakephp cakephp-3.0

我不明白如果在select I use Lessons.lesson_date'或lessons.lesson_date中我如何获得lesson_date字段的不同输出。我以为我应该使用课程而不是课程,而且对于一个单一的名称并不重要。

with Lessons.lesson_date我开始调试:

'lesson_date' => object(Cake\I18n\FrozenDate) {
        'time' => '2015-07-09T00:00:00+00:00',
        'timezone' => 'UTC',
        'fixedNowTime' => false

    },

with lessons.lesson_date我得到了更好的输出:

'lessons' => [
        'id' => '5399',
        'lesson_date' => '2015-07-09'

//这是我正在谈论的下面的代码。 Lessons.lesson_date给出的输出与将其更改为lessons.inon_date

时的输出不同。
 $query3 = $this->Lessons->find()
              ->contain(['TutoringTypes'])
              ->select(['lessons.id','Lessons.lesson_date','Lessons.tutoring_type_id',
                  'TutoringTypes.value'])      
               ->where(['Lessons.lesson_date >' => $a3,'Lessons.lesson_date <' => $a4, .....

1 个答案:

答案 0 :(得分:2)

这是遵循约定时的预期/正确行为,日期根据其类型进行转换。

后一个输出可能更适合您对数据的处理,但通常前者是“更好”,因为日期对象使您可以更自由地操作日期,处理本地化,输出格式等... < / p>

为什么?

至于原因,输出是不同的,因为ORM不会在非常规列别名的情况下转换值,因为它不存在于类型映射中,该类型映射包含哪个列属于哪种类型的信息。

使用lessons.lesson_date会创建

的别名
lessons__lesson_date

不符合约定,其中使用Lessons.lesson_date将创建

的别名
Lessons__lesson_date

遵循约定,并将匹配类型映射中的字段,从而导致ORM转换数据。

更改行为

如果您需要YYYY-MM-DD输出,那么您只需输出它就可以在您的视图中将其格式化为

echo $lesson->lesson_date->i18nFormat('yyyy-MM-dd')

或更改默认输出格式(将日期转换为字符串时使用)

\Cake\I18n\FrozenDate::setToStringFormat('yyyy-MM-dd');

或甚至可能更改类型映射中的类型,以便将日期字符串保持为

    $query = $this->Lessons
        ->find()
        // ...

    $types = ['Lessons__lesson_date' => 'string'] + $query->selectTypeMap()->defaults();
    $query->selectTypeMap()->defaults($types);

另见