#Controller上でプロパティを追加する
Controller上でデータベースから取得したデータに、新しくプロパティを追加できることに気がつきました。
$object->新しいプロパティ名=〇〇
で新たなプロパティを追加できます。
尚その場限りのもので、これだけではプロパティを保存したり、テーブルのカラムを書き換えたりすることができないようです。
#前提
- Laravel5.8を使用。
- twitterのようなアプリを作っています。投稿を一覧表示する、会員登録、ログイン、つぶやきの投稿、いいねが可能です。
#コード
以下はアプリのcontrollerの一部を抜粋したものです。
一覧表示するための投稿データを取得し、自分が投稿に対していいね押していた場合プロパティを追加します。
public function index()
{
$posts = Post::with('likes')->latest()->paginate(20);
$user_id = Auth::id();
if($user_id){
foreach($posts as $post){
foreach($post->likes as $like){
if($like->user_id===$user_id){
//新しく追加するプロパティ
$post->liked_id = $like->id;
}
}
}
}
return view('index')->with('posts',$posts);
}
dd($post)で、$postのattributesを確認するとプロパティが追加されているのがわかります。
プロパティ追加前
attributes: array:5 [▼
"id" => 18
"created_at" => "2005-11-09 09:04:07"
"updated_at" => "1999-11-01 17:05:26"
"body" => "Libero nihil eum nam suscipit."
"user_id" => 4
]
プロパティ追加後
attributes: array:6 [▼
"id" => 18
"created_at" => "2005-11-09 09:04:07"
"updated_at" => "1999-11-01 17:05:26"
"body" => "Libero nihil eum nam suscipit."
"user_id" => 4
"liked_id" => 6
新しいプロパティは既存のプロパティと同じように、$post->propaty
で使うことができます。
アプリでは$post->liked_idが存在するか否かで画面の表示を変えたり、リンクを切り替えたりすることに使っています。
これで自分が投稿にいいねを押していたとき、表示を変える機能を実装することができました。
またEagerLoadと組み合わせてクエリを削減したり、ユーザーの属性に合わせて動的にプロパティを追加、変更できると思います。ちょっとだけ便利かもしれません。
#参考
[【Laravel】EagerLoadまとめ。動的プロパティとEloquentリレーションの違いなど]
(https://qiita.com/katsunory/items/d4757b8d9ac099a5291e)
[Laravel 5.7で基本的なCRUDを作る]
(https://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)
(こちらを参考にアプリを作らせていただきました。ありがとうございます)