Eloquent 使用 casts 來處理資料 進階

來源:互聯網
上載者:User
#概述

有很多時候你會想去使用json來儲存資料,那麼,使用 $casts 是最好不過的選擇,但是不僅如此,你還可以做的更多。

Basic

這裡是官方文檔, link.

還有RryTip 的一個關於 casts的視頻, Use casts change your datetype

加深

那麼,我們來更進一步的去處理這種資料關係。

這裡有一個使用者映像(avatar)的例子,我們需要儲存上傳的原圖(original),以及處理後的小圖(thumbnail),你可以把這裡看成一個 one-to-one的關聯式模式,自然的就有了我們的 Avatar 這個類。

Demo

簡單起見,修改 create_users_table

$table->increments('id');$table->string('name');$table->json('avatar')->nullable();$table->timestamps();

然後去 User.php中定義一下

protected $fillable = [    'name', 'avatar'];protected $casts = [    'avatar' => 'json'];

現在簡單的定義好了,還沒有進入後面的,不過先去測試一下, routes.php

Route::get('/', function() {    User::create([        'name' => 'RryLee',        'avatar' => [            'original' => 'original-avatar.jpg',            'thumbnail' => 'original-avatar.thumbnail.jpg',        ]    ]);});Route::get('/get', function() {    $user = User::findOrFail(1);    return $user;});

不用看,資料是肯定能儲存的,也能擷取到。

問題來了

你現在怎麼去修改(這裡只是假如,使用者又重新剪裁了原圖,只是說明修改這種情況),這個時候還真的需要引入我們的 Avatar類了.

avatar = $avatar;        $this->user = $user;    }    public function get($key)    {        return array_get($this->avatar, $key);    }    public function set($key, $value)    {        $this->avatar[$key] = $value;        return $this->persist();    }    public function has($key)    {        return array_key_exists($key, $this->avatar);    }    public function all()    {        return $this->avatar;    }    public function merge(array $attributes)    {        $this->avatar = array_merge(            $this->avatar,            array_only($attributes, static::$allowed)        );        return $this->persist();    }    protected function persist()    {        return $this->user->update([            'avatar' => $this->avatar        ]);    }    public function __get($key)    {        if ($this->has($key)) {            return $this->get($key);        }        throw new Exception("The {$key} avatar not exists.");    }}

這裡我直接拿來了一段代碼, 注意 persist()

接著像添加一個關係一樣去 User模型中添加一下就可以了.

public function avatar()    {    return new Avatar(isset($this->avatar) ? $this->avatar : [], $this);}

現在就可以盡情的對我們的 avatar來進行操作了

Route::get('save', function() {    $user = User::findOrFail(1);    $avatar = $user->avatar();    $avatar->set('original', 'change.jpg');    return 'Done!';});

資料庫中的值應該變化了!

總結

Eloquent真的各種提高效率,各種簡單,各種變化!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.