Laravel模型屬性$dates作用是什麼?

bluememory發表於2022-05-13

1). 當前使用的 Laravel 版本?

Laravel8

今天看到模型$date屬性,搜尋了一下,網上說他的作用是:裡面所包含的欄位,就是當使用這個屬性的時候,可以直接後面跟著carbon類時間操作的任何方法。
然後我自己試著驗證一下,我有個模型如下:

<?php

/**
 * Created by Reliese Model.
 */

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class UserTrip extends Model
{
    protected $table = 'user_trip';

    protected $dates = [
        'created_at',
        'updated_at'
    ];
}

然後我在控制器查詢列印:

 $trip = UserTrip::where(['id' => 2])
            ->select(["*"])
            ->first();
        var_dump($trip->created_at);
        echo $trip->created_at->getTimestamp();

列印結果:

object(Illuminate\Support\Carbon)#310 (19) {
  ["endOfTime":protected]=>
  bool(false)
  ["startOfTime":protected]=>
  bool(false)
  ["constructedObjectId":protected]=>
  string(32) "000000000a76bc7c0000000031c40a50"
  ["localMonthsOverflow":protected]=>
  NULL
  ["localYearsOverflow":protected]=>
  NULL
  ["localStrictModeEnabled":protected]=>
  NULL
  ["localHumanDiffOptions":protected]=>
  NULL
  ["localToStringFormat":protected]=>
  NULL
  ["localSerializer":protected]=>
  NULL
  ["localMacros":protected]=>
  NULL
  ["localGenericMacros":protected]=>
  NULL
  ["localFormatFunction":protected]=>
  NULL
  ["localTranslator":protected]=>
  NULL
  ["dumpProperties":protected]=>
  array(3) {
    [0]=>
    string(4) "date"
    [1]=>
    string(13) "timezone_type"
    [2]=>
    string(8) "timezone"
  }
  ["dumpLocale":protected]=>
  NULL
  ["dumpDateProperties":protected]=>
  NULL
  ["date"]=>
  string(26) "2022-04-27 11:17:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Asia/Shanghai"
}
1651029430

說明確實是一個Carbon物件,然後我把模型的$date陣列裡的updated_at去掉,再次執行控制器程式碼
發現結果一樣,還是Carbon物件:

object(Illuminate\Support\Carbon)#310 (19) {
  ["endOfTime":protected]=>
  bool(false)
  ["startOfTime":protected]=>
  bool(false)
  ["constructedObjectId":protected]=>
  string(32) "00000000236533c0000000006c7d0566"
  ["localMonthsOverflow":protected]=>
  NULL
  ["localYearsOverflow":protected]=>
  NULL
  ["localStrictModeEnabled":protected]=>
  NULL
  ["localHumanDiffOptions":protected]=>
  NULL
  ["localToStringFormat":protected]=>
  NULL
  ["localSerializer":protected]=>
  NULL
  ["localMacros":protected]=>
  NULL
  ["localGenericMacros":protected]=>
  NULL
  ["localFormatFunction":protected]=>
  NULL
  ["localTranslator":protected]=>
  NULL
  ["dumpProperties":protected]=>
  array(3) {
    [0]=>
    string(4) "date"
    [1]=>
    string(13) "timezone_type"
    [2]=>
    string(8) "timezone"
  }
  ["dumpLocale":protected]=>
  NULL
  ["dumpDateProperties":protected]=>
  NULL
  ["date"]=>
  string(26) "2022-04-27 11:17:10.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Asia/Shanghai"
}
1651029430

所以我搞不明白這個屬性是幹嘛的了?

好像發現問題了,這2個欄位在MySQL裡面是datetime型別的,改為其他比如timestamp,去掉updated_at之後就報錯了,因為他不是carbon物件。

剛剛又驗證了下,如果我新增一個欄位test_time,不管他是datetime型別還是timestamp型別,在$dates陣列配就是carbon物件,不在就不是。所以個人認為是框架預設對created_at,updated_at轉為carbon物件,其他欄位要自定義【比如上面的test_time,要想讓他是carbon物件,就要放到$dates陣列】

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章