W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
你不僅可以將數(shù)據(jù)轉(zhuǎn)換成原生的數(shù)據(jù)類(lèi)型,還可以將數(shù)據(jù)轉(zhuǎn)換成對(duì)象。兩種自定義類(lèi)型轉(zhuǎn)換的定義方式非常類(lèi)似。但是將數(shù)據(jù)轉(zhuǎn)換成對(duì)象的自定義轉(zhuǎn)換類(lèi)中的 set
方法需要返回鍵值對(duì)數(shù)組,用于設(shè)置原始、可存儲(chǔ)的值到對(duì)應(yīng)的模型中。
舉個(gè)例子,定義一個(gè)自定義類(lèi)型轉(zhuǎn)換類(lèi)用于將多個(gè)模型屬性值轉(zhuǎn)換成單個(gè) Address
值對(duì)象,假設(shè) Address
對(duì)象有兩個(gè)公有屬性 lineOne
和 lineTwo
:
<?php
namespace App\Casts;
use App\Models\Address;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use InvalidArgumentException;
class Address implements CastsAttributes
{
/**
* 將取出的數(shù)據(jù)進(jìn)行轉(zhuǎn)換
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @param mixed $value
* @param array $attributes
* @return \App\Models\Address
*/
public function get($model, $key, $value, $attributes)
{
return new Address(
$attributes['address_line_one'],
$attributes['address_line_two']
);
}
/**
* 轉(zhuǎn)換成將要進(jìn)行存儲(chǔ)的值
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @param \App\Models\Address $value
* @param array $attributes
* @return array
*/
public function set($model, $key, $value, $attributes)
{
if (! $value instanceof Address) {
throw new InvalidArgumentException('The given value is not an Address instance.');
}
return [
'address_line_one' => $value->lineOne,
'address_line_two' => $value->lineTwo,
];
}
}
進(jìn)行值對(duì)象類(lèi)型轉(zhuǎn)換后,任何對(duì)值對(duì)象的數(shù)據(jù)轉(zhuǎn)換將會(huì)自動(dòng)同步回模型中:
$user = App\Models\User::find(1);
$user->address->lineOne = 'Updated Address Value';
$user->save();
技巧:如果想將包含值對(duì)象的 Eloquent 模型序列化為 JSON 或數(shù)組,你只需讓該模型實(shí)現(xiàn)
Illuminate\Contracts\Support\Arrayable
和JsonSerializable
接口即可。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: