<?php
namespace Illuminate\Database\Eloquent;
/**
* 下面提到某些詞的含義:
* 1、覆蓋: 在繼承該類 \Illuminate\Database\Eloquent\Model 的自定義的模型類中, 定義一個同名 field,值不一樣
*/
abstract class Model1 implements ArrayAccess, Arrayable, Jsonable, JsonSerializable, QueueableEntity, UrlRoutable
{
/**
* 數據庫連接,我們在 config/database.php 里面的 connections 數組定義的連接。
* usage:
* (new xxModel)->connection('mysql')
* DB::connection('pgsql')
* 或者在模型定義里面覆蓋該屬性,如: protected $connection = 'pgsql';
*/
protected $connection;
/**
* 模型關聯的數據庫表名,默認是 模型名->下划線命名->復數形式,
* 好比如定義了 User 模型,class User extend Model,那么默認的表名是 users。
*
* usage:
* (new xxModel)->setTable('xxx')
* (new xxModel)->getModel()
* 或者在模型定義的時候覆蓋該屬性,如: protected $table = 'tb_user';
*/
protected $table;
/**
* 主鍵字段,默認為 id,也可以覆蓋該屬性
*/
protected $primaryKey = 'id';
/**
* 不知道哪里用到,除了該文件的 getter 和 setter
*/
protected $perPage = 15;
/**
* 主鍵是否默認自增長
*/
public $incrementing = true;
/**
* 是否由模型去維護時間戳字段,如果我們想手動去維護,可以設置為 false
* usage:
* 默認的時間戳字段是 created_at、updated_at,
* 我們如果想要使用自定義的字段,則要在模型里面覆蓋 CREATED_AT、UPDATED_AT 這兩個常量(下面有定義)
* 其他:
* 默認使用 mysql 的 datetime 類型,如果需要更改為 10 位整型,可以設置 protected $dateFormat = 'U'; ()
*/
public $timestamps = true;
/**
* 我們在給模型對象設置非 public 屬性的時候,會通過 setAttributes 方法,保存到該數組中
* usage:
* $user = new User();
* $user->name = 'laravel';
* User 中沒有定義 public $name 的時候, $attributes 就會多了 'name' => 'laravel' 的鍵值對
*/
protected $attributes = [];
/**
* 保存模型的原始數據,后續修改模型屬性只會修改 $attributes,以便偵測變化
*/
protected $original = [];
/**
* 模型的關聯數據
*/
protected $relations = [];
/**
* 隱藏的屬性,我們調用模型的 toArray 方法的時候不會得到該數組中的屬性,
* 如果需要也得到隱藏屬性,可以通過 withHidden 方法
*/
protected $hidden = [];
/**
* 與 hidden 數組作用差不多,共同作用
*/
protected $visible = [];
/**
* 其中一個用法,根據現有某幾個屬性,計算出新屬性,並在 模型 toArray 的時候顯示
* usage:
* 模型里面定義: protected $appends = ['full_name'];
* public function getFullNameAttribute() { return $this->firstName . ' ' . $this->lastName; }
*/
protected $appends = [];
/**
* mass assignment 的時候可以批量設置的屬性,目的是防止用戶提交我們不想更新的字段
* 注意:
* 和 $guarded 同時使用的時候, $guard 設置的會無效
*/
protected $fillable = [];
/**
* 不能批量賦值的屬性
*/
protected $guarded = ['*'];
/**
* 需要進行時間格式轉換的字段
* 應用場景:
* 一般情況我們只定義了 created_at、updated_at,我們還可能會保存用戶注冊時間這些,register_time,
* 這樣我們就可以定義,protected $dates = ['register_time'];
* 好比如:
* 我們定義的 $dateFormat 為 mysql 的 datetime 格式,我們即使把 register_time 設置為 time(),
* 實際保存的其實是 datetime 格式的
*/
protected $dates = [];
/**
* created_at、updated_at、$dates數組 進行時間格式轉換的時候使用的格式
*/
protected $dateFormat;
/**
* 自動格式轉換,定義方式: protected $casts = ['info' => 'json'];
* 所有可用格式: int、integer、real、float、double、string、bool、boolean、
* object、array、json、collection、date、datetime
* 應用場景:
* 我們想要保存某些特殊格式到數據庫(如json、object),我們可以使用該數組對我們的數據進行自動轉換,
* usage:
* $user = User::create([
* 'name' => 'ruby',
* 'info' => ['city' => 'Guangzhou']
* ]);
*
* $query_user = User::find($user['id']);
* dd($query_user->info);
* 這里我們可以看數據庫保存的 info 字段,實際上是 json 編碼的,並且取出來的是 json 解碼后的數據
*/
protected $casts = [];
/**
* 需要同步更新 updated_at 的關聯,調用 save 方法的時候會更新該數組里面定義的關聯的 updated_at 字段
*/
protected $touches = [];
/**
* todo 自定義事件,目前還沒用過 -_-
*/
protected $observables = [];
/**
* 需要預加載的關聯
*/
protected $with = [];
/**
* The class name to be used in polymorphic relations.
*
* todo 也不知道
*/
protected $morphClass;
/**
* 模型是否存在
*/
public $exists = false;
/**
* 判斷模型是否是當前請求插入的
*/
public $wasRecentlyCreated = false;
/**
* 模型屬性名是否是下划線形式的
*/
public static $snakeAttributes = true;
/**
* 用來建立數據庫連接
*
* @var \Illuminate\Database\ConnectionResolverInterface
*/
protected static $resolver;
/**
* 用來分發模型事件
*
* @var \Illuminate\Contracts\Events\Dispatcher
*/
protected static $dispatcher;
/**
* 模型 new 的時候調用模型的 bootXXX 方法, XXX 是模型名稱
*/
protected static $booted = [];
/**
* 全局查詢條件,需要定義
*
* @see \Illuminate\Database\Eloquent\ScopeInterface
*/
protected static $globalScopes = [];
/**
* 批量設置屬性的時候是否不需要篩選字段
*/
protected static $unguarded = false;
/**
* 緩存 getXXAttribute 的值
*/
protected static $mutatorCache = [];
/**
* 多對多關聯方法,不知道哪里用了
*/
public static $manyMethods = ['belongsToMany', 'morphToMany', 'morphedByMany'];
/**
* 創建時間戳字段名稱
*/
const CREATED_AT = 'created_at';
/**
* 更新時間戳字段名稱
*/
const UPDATED_AT = 'updated_at';
}