#概要
json を使用してデータを保存したい場合は、$casts を使用することが最良の選択であることがよくありますが、それだけでなく、もっと。
こちらが公式ドキュメントのリンクです
RryTip によるキャストに関するビデオもあります。キャストを使用して datetype を変更してください
次に、このデータ関係をさらに処理してみましょう。
これはユーザー画像 (アバター) の例です。アップロードされた元の画像 (オリジナル) と処理されたサムネイルを保存する必要があります。これは自然に 1 対 1 の関係モデルとして考えることができます。アバタークラスがあります。
簡単にするために、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 クラスを導入する必要があります。
<?phpnamespace App;use App\User;use Exception;class Avatar{ protected $user; protected static $allowed = [ 'original', 'thumbnail' ]; protected $avatar = []; public function __construct($avatar, User $user) { $this->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);}
データベースの値が変更されます。
Route::get('save', function() { $user = User::findOrFail(1); $avatar = $user->avatar(); $avatar->set('original', 'change.jpg'); return 'Done!';});
Eloquent は効率、シンプルさ、変更を本当に改善します。