LoginSignup
1
3

More than 3 years have passed since last update.

[Laravel5.8]Controller上でデータ取得後、新しくプロパティを追加する

Last updated at Posted at 2019-08-03

Controller上でプロパティを追加する

Controller上でデータベースから取得したデータに、新しくプロパティを追加できることに気がつきました。
$object->新しいプロパティ名=〇〇
で新たなプロパティを追加できます。

尚その場限りのもので、これだけではプロパティを保存したり、テーブルのカラムを書き換えたりすることができないようです。

前提

  • Laravel5.8を使用。
  • twitterのようなアプリを作っています。投稿を一覧表示する、会員登録、ログイン、つぶやきの投稿、いいねが可能です。

コード

以下はアプリのcontrollerの一部を抜粋したものです。
一覧表示するための投稿データを取得し、自分が投稿に対していいね押していた場合プロパティを追加します。

PostController.php
    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が存在するか否かで画面の表示を変えたり、リンクを切り替えたりすることに使っています。
これで自分が投稿にいいねを押していたとき、表示を変える機能を実装することができました。

スクリーンショット 2019-08-03 17.57.20.png

またEagerLoadと組み合わせてクエリを削減したり、ユーザーの属性に合わせて動的にプロパティを追加、変更できると思います。ちょっとだけ便利かもしれません。

参考

【Laravel】EagerLoadまとめ。動的プロパティとEloquentリレーションの違いなど
Laravel 5.7で基本的なCRUDを作る
(こちらを参考にアプリを作らせていただきました。ありがとうございます)

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3