Laravel 8 值對(duì)象類(lèi)型轉(zhuǎn)換

2021-07-19 11:45 更新

你不僅可以將數(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è)公有屬性 lineOnelineTwo

<?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\ArrayableJsonSerializable 接口即可。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)