## 類型轉換
對于前面的時間戳`birthday`的例子,還可以進行進一步的簡化,這里需要用到類型強制轉換的功能,在`User`模型類中添加定義:
```
<pre class="calibre18">
```
<?php
namespace app\index\model;
use think\<span class="hljs-operator">Model</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Model</span></span>{
<span class="hljs-keyword">protected</span> $dateFormat = <span class="hljs-operator">'Y</span>/m/d';
<span class="hljs-keyword">protected</span> $<span class="hljs-operator"><span class="hljs-keyword">type</span> =</span> [
<span class="hljs-comment">// 設置birthday為時間戳類型(整型)</span><span class="hljs-operator">'birthda</span>y' => <span class="hljs-operator">'timestam</span>p',
];
}
```
```
不需要定義任何修改器和讀取器,我們完成了相同的功能。
對于`timestamp`和`datetime`類型,如果不設置模型的`dateFormat`屬性,默認的日期顯示格式為:`Y-m-d H:i:s`,或者也可以顯示的設置日期格式,例如:
```
<pre class="calibre18">
```
<?php
namespace app\index\model;
use think\<span class="hljs-operator">Model</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Model</span></span>{
<span class="hljs-keyword">protected</span> $<span class="hljs-operator"><span class="hljs-keyword">type</span> =</span> [
<span class="hljs-comment">// 設置birthday為時間戳類型(整型)</span><span class="hljs-operator">'birthda</span>y' => <span class="hljs-operator">'timestamp</span>:<span class="hljs-operator">Y</span>/m/d',
];
}
```
```
> ### 提示:
>
> - - - - - -
>
> 對于簡單的數據格式轉換之類的處理,設置類型轉換比定義修改器和讀取器更加方便。
`ThinkPHP5.0`支持的轉換類型包括:
類型 描述 integer 整型 float 浮點型 boolean 布爾型 array 數組 json JSON類型 object 對象 datetime 日期時間 timestamp 時間戳(整型) serialize 序列化## 自動時間戳
對于固定的時間戳和時間日期型的字段,比如文章的創建時間、修改時間等字段,還有比設置類型轉換更簡單的方法,尤其是所有的數據表統一處理的話,只需要在數據庫配置文件中添加設置:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 開啟自動寫入時間戳字段</span><span class="hljs-string">'auto_timestamp'</span> => <span class="hljs-keyword">true</span>,
```
```
再次訪問
```
<pre class="calibre18">
```
http://tp5.com/<span class="hljs-operator">user</span>/<span class="hljs-operator">add</span>
```
```
會發現系統已經自動寫入了`think_user`數據表中的的`create_time`、`update_time`字段,如果自動寫入的時間戳字段不是這兩個的話,需要修改模型類的屬性定義,例如:
```
<pre class="calibre18">
```
<?php
namespace app\index\model;
use think\<span class="hljs-operator">Model</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Model</span></span>{
<span class="hljs-comment">// 定義類型轉換</span><span class="hljs-keyword">protected</span> $<span class="hljs-operator"><span class="hljs-keyword">type</span> =</span> [
<span class="hljs-operator">'birthda</span>y' => <span class="hljs-operator">'timestamp</span>:<span class="hljs-operator">Y</span>/m/d',
];
<span class="hljs-comment">// 定義時間戳字段名</span><span class="hljs-keyword">protected</span> $createTime = <span class="hljs-operator">'create_a</span>t';
<span class="hljs-keyword">protected</span> $updateTime = <span class="hljs-operator">'update_a</span>t';
}
```
```
如果個別數據表不需要自動寫入時間戳字段的話,也可以在模型里面直接關閉:
```
<pre class="calibre18">
```
<?php
namespace app\index\model;
use think\<span class="hljs-operator">Model</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Model</span></span>{
<span class="hljs-comment">// 定義類型轉換</span><span class="hljs-keyword">protected</span> $<span class="hljs-operator"><span class="hljs-keyword">type</span> =</span> [
<span class="hljs-operator">'birthda</span>y' => <span class="hljs-operator">'timestamp</span>:<span class="hljs-operator">Y</span>/m/d',
];
<span class="hljs-comment">// 關閉自動寫入時間戳</span><span class="hljs-keyword">protected</span> $autoWriteTimestamp = <span class="hljs-number">false</span>;
}
```
```
關閉自動寫入時間戳后,我們再次訪問URL地址:
```
<pre class="calibre18">
```
http://tp5.com/<span class="hljs-operator">user</span>/<span class="hljs-operator">add</span>
```
```
重新生成的數據已經沒有自動寫入時間戳了,而是數據庫默認值寫入。
默認的時間戳字段類型是整型,如果需要使用其它的時間字段類型,可以做如下設置:
```
<pre class="calibre18">
```
<?php
namespace app\index\model;
use think\<span class="hljs-operator">Model</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Model</span></span>{
<span class="hljs-comment">// 定義類型轉換</span><span class="hljs-keyword">protected</span> $<span class="hljs-operator"><span class="hljs-keyword">type</span> =</span> [
<span class="hljs-operator">'birthda</span>y' => <span class="hljs-operator">'timestamp</span>:<span class="hljs-operator">Y</span>/m/d',
];
<span class="hljs-comment">// 指定自動寫入時間戳的類型為dateTime類型</span><span class="hljs-keyword">protected</span> $autoWriteTimestamp = <span class="hljs-operator">'datetim</span>e';
}
```
```
如果全局的自動時間戳的類型是統一的,也可以直接在數據庫配置文件中設置:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 開啟自動寫入時間戳字段</span><span class="hljs-string">'auto_timestamp'</span> => <span class="hljs-string">'datetime'</span>,
```
```
> 如上設置后,你的`think_user`數據表中的`create_time`和 `update_time` 字段類型就必須更改為`datetime`類型的格式。
支持設置的時間戳類型包含:`datetime`、`date`和`timestamp`。
## 自動完成
系統已經自動寫入了`think_user`數據表中的的`create_time`、`update_time`字段,如果我們希望自動寫入其它的字段,則可以使用自動完成功能,例如下面實現新增的時候自動寫入`status`字段。
```
<pre class="calibre18">
```
<?php
namespace app\index\model;
use think\<span class="hljs-operator">Model</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword"><span class="hljs-operator">extends</span></span> <span class="hljs-title">Model</span></span>{
<span class="hljs-comment">// 定義類型轉換</span><span class="hljs-keyword">protected</span> $<span class="hljs-operator"><span class="hljs-keyword">type</span> =</span> [
<span class="hljs-operator">'birthda</span>y' => <span class="hljs-operator">'timestamp</span>:<span class="hljs-operator">Y</span>/m/d',
];
<span class="hljs-comment">// 定義自動完成的屬性</span><span class="hljs-keyword">protected</span> $insert = [<span class="hljs-operator">'statu</span>s' => <span class="hljs-number">1</span>];
}
```
```
除了`insert`屬性之外,自動完成共有三個屬性定義,分別是:
屬性 描述 auto 新增及更新的時候自動完成的屬性數組 insert 僅新增的時候自動完成的屬性數組 update 僅更新的時候自動完成的屬性數組自動完成屬性里面一般來說僅僅需要定義屬性的名稱,然后配合修改器或者類型轉換來一起完成,如果寫入的是一個固定的值,就無需使用修改器。`status`屬性的自動寫入可以直接使用:
```
<pre class="calibre18">
```
<span class="hljs-string">'status'</span> => <span class="hljs-number">1</span>
```
```
完成后,我們訪問URL地址:
```
<pre class="calibre18">
```
http://tp5.com/<span class="hljs-operator">user</span>/<span class="hljs-operator">add</span>
```
```
最后的輸出結果為:
```
<pre class="calibre18">
```
用戶<span class="hljs-operator">[ 流年:12 ]</span>新增成功
```
```
為了便于看到效果,我們修改控制器的`read`操作方法輸出更多的屬性:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 讀取用戶數據</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span><span class="hljs-number">(<span class="hljs-regexp">$id</span>=<span class="hljs-string">''</span>)</span></span>{
<span class="hljs-regexp">$user</span> = UserModel::get(<span class="hljs-regexp">$id</span>);
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->nickname . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->email . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->birthday . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->status . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->create_time . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->update_time . <span class="hljs-string">'<br/>'</span>;
}
```
```
然后,訪問URL地址:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/user/12</span>
```
```
最后的輸出結果為:
```
<pre class="calibre18">
```
流年
thinkphp@qq.com
<span class="hljs-number">1977</span>/<span class="hljs-number">03</span>/<span class="hljs-number">05</span><span class="hljs-number">1</span><span class="hljs-number">2016</span>-<span class="hljs-number">05</span>-<span class="hljs-number">02</span> <span class="hljs-number">16</span>:<span class="hljs-number">21</span>:<span class="hljs-number">33</span><span class="hljs-number">2016</span>-<span class="hljs-number">05</span>-<span class="hljs-number">02</span> <span class="hljs-number">16</span>:<span class="hljs-number">21</span>:<span class="hljs-number">33</span>
```
```
可以看到`status`、`create_time`和`update_time`都實現了自動寫入。
如果你的`status`屬性的值不是固定的,而是需要條件判斷,那么我們可以定義修改器來配合自動完成。
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span></span>{
<span class="hljs-comment">// 定義類型轉換</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$type</span> = [
<span class="hljs-string">'birthday'</span> => <span class="hljs-string">'timestamp:Y/m/d'</span>,
];
<span class="hljs-comment">// 定義自動完成的屬性</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$insert</span> = [<span class="hljs-string">'status'</span>];
<span class="hljs-comment">// status屬性修改器</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setStatusAttr</span><span class="hljs-number">(<span class="hljs-regexp">$value</span>, <span class="hljs-regexp">$data</span>)</span></span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'流年'</span> == <span class="hljs-regexp">$data</span>[<span class="hljs-string">'nickname'</span>] ? <span class="hljs-number">1</span> : <span class="hljs-number">2</span>;
}
<span class="hljs-comment">// status屬性讀取器</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getStatusAttr</span><span class="hljs-number">(<span class="hljs-regexp">$value</span>)</span></span>{
<span class="hljs-regexp">$status</span> = [-<span class="hljs-number">1</span> => <span class="hljs-string">'刪除'</span>, <span class="hljs-number">0</span> => <span class="hljs-string">'禁用'</span>, <span class="hljs-number">1</span> => <span class="hljs-string">'正常'</span>, <span class="hljs-number">2</span> => <span class="hljs-string">'待審核'</span>];
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$status</span>[<span class="hljs-regexp">$value</span>];
}
}</span>
```
```
我們訪問下面的URL地址進行批量新增
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/user/add_list</span>
```
```
之后,訪問
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/user/18</span>
```
```
最后的輸出結果為:
```
<pre class="calibre42">
```
張三
zhanghsan@qq.com
<span class="hljs-number">1988</span>/<span class="hljs-number">01</span>/<span class="hljs-number">15</span>
待審核
<span class="hljs-number">2016</span>-<span class="hljs-number">05</span>-<span class="hljs-number">02</span> <span class="hljs-number">16</span>:<span class="hljs-number">40</span>:<span class="hljs-number">57</span><span class="hljs-number">2016</span>-<span class="hljs-number">05</span>-<span class="hljs-number">02</span> <span class="hljs-number">16</span>:<span class="hljs-number">40</span>:<span class="hljs-number">57</span>
```
```
- 脕茫隆壟脨貌脩脭
- 脕茫隆壟脨貌脩脭
- 脪祿隆壟祿霉麓隆
- 脪祿隆壟祿霉麓隆
- 露鎂隆壟URL潞脥脗路脫脡
- 露鎂隆壟URL潞脥脗路脫脡
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脣脛隆壟脢媒戮脻驢芒
- 脣脛隆壟脢媒戮脻驢芒
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脕霉隆壟脛攏脨脥潞脥鹿脴脕陋
- 攏簍1攏漏脛攏脨脥露簍脪氓
- 攏簍2攏漏祿霉麓隆虜脵脳梅
- 攏簍3攏漏露脕脠隆脝梅潞脥脨脼賂脛脝梅
- 攏簍4攏漏脌脿脨脥脳陋祿祿潞脥脳脭露爐脥錨魯脡
- 攏簍5攏漏虜茅脩爐路露脦摟
- 攏簍6攏漏脢盲脠毛潞脥脩茅脰隴
- 攏簍7攏漏鹿脴脕陋
- 攏簍8攏漏脛攏脨脥脢盲魯枚
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 戮脜隆壟API驢陋路壟
- 戮脜隆壟API驢陋路壟
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬露鎂隆壟脭脫脧卯
- Cookie
- Session
- 碌樓脭陋虜芒脢脭
- 脥錄脧帽麓婁脌鉚
- 脦脛錄鎂脡脧麓蘆
- 脩茅脰隴脗毛
- 賂陸脗錄
- A隆壟魯攏錄沒脦脢脤芒錄爐
- B隆壟3.2潞脥5.0脟酶鹵冒
- C隆壟脰煤脢脰潞爐脢媒
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝