質問: Post::findOrFail($post_id); \DB::transaction(function () use ($post) { $post->comments()->delete(); $post->delete(); }); return redirect()->route('top'); } ``` と定義されており、結果として、投稿データとそれに紐づくコメント全てがテーブルからdeleteされるのですが、 ``` $post->comments()->delete(); ``` の、comments()とは、Postモデルで定義されているcommentsメソッドのことでしょうか。 $postの値をcomments関数に渡して、deleteを実行している、ということでしょうか。ここが上手く言語化できません。 変数->関数 というアロー演算子の使い方は、公式ドキュメントでも見当たらず、他にサンプルがないので処理内容が分かりません。 長文になってしまい恐縮ですが、どなたかお時間のある方、サイトをご参照のうえ上記内容について、合っている/そうじゃない・正しくはこう、といったアドバイスいただけないでしょうか。 宜しくお願いいたします。
回答: > > 変数->関数 というアロー演算子の使い方は、公式ドキュメントでも見当たらず、他にサンプルがないので> 処理内容が分かりません。 > > > 変数->関数という考え方だと余計に混乱すると思います。ここはPHPにおける、オブジェクト指向のインスタンスとメソッドの関係です。LaravelはあくまでPHPを使ったフレームワークなので、公式マニュアルもPHPの記述ルールを熟知している前提での補足説明にとどまっています。したがって、この辺りはPHPのオブジェクト指向を参照した方がいいでしょう。公式ページもありますが、自分はこのページで勉強しました。 PHPのオブジェクト指向入門 > > なぜ2つのテーブルから一気にデータを取得できるのか、が上手く言語化できません。 > > > ここはリンク先のページのDBテーブル設計を見たらわかると思いますが、postsマスタのidとcommentsトランザクションのuser_idが双方紐付いているからです。`hasMany()`は1対多の関係、対して`belongsTo`は多対1の関係になっています。これをわかりやすく言えば 一つの投稿(posts)には複数の記事(comments)を持っているということです。そのidを紐付けておかないと、記事はバラバラになってしまい、うまく整理することができないですね。 > > 、comments()とは、Postモデルで定義されているcommentsメソッドのことでしょうか。 > > $postの値をcomments関数に渡して、deleteを実行している、ということでしょうか。ここが上手く言語化できません。 > > > > > destoryメソッドにある`\DB::transaction(function () use ($post) {...}`はPHPにおける**クロージャ**の記述です。クロージャは説明するとややこしくなりますが、平たく言えば同じidを持つデータに対し、同じ処理を繰り返す仕組みです。したがって、特定の投稿idを持つ記事全部に対して、記事がなくなるまでDBにおけるdelete文処理を繰り返すことになります。