#概述
有很多時候你會想去使用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真的各種提高效率,各種簡單,各種變化!