PHPバージョン:7.1.14
Laravelバージョン:5.7.9
Eloquentのリレーション、続いては1対他を表現するhasMany結合です!
Author(著者)とArticle(記事)の関係といえば、
著者がいくつもの記事を作成しているのが普通ですよね!
逆に記事は(共同作成など例外もありますが通常は、)
1人の著者に属します!
Authorモデル編集
それではまずは、Authorモデルを編集していきます。
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Author extends Model { protected $guarded = array('id'); public function article() { return $this->hasOne('App\Models\Article'); } // ***** 開始 ***** public function articles() { return $this->hasMany('App\Models\Article'); } // ***** 終了 ***** }
app>Models>Author
articlesメソッドを追加しました。
hasOneと書き方は一緒です。
MySQLのarticlesテーブルデータ修正
hasManyを使うため、
MySQLに登録されているaurhorsデータを編集します。
mysql> update articles set author_id = 1 where id = 2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
id=2のArticle(記事)のauthor_idを、1にアップデートしました。
mysql> select id,title,author_id from articles; +----+-------------------------------------+-----------+ | id | title | author_id | +----+-------------------------------------+-----------+ | 1 | 【Laravel】Controllerの使い方 | 1 | | 2 | 【Laravel】Viewの使い方 | 1 | | 3 | 【Laravel】 Modelの使い方 | 3 | +----+-------------------------------------+-----------+ 3 rows in set (0.00 sec)
author_idが1の記事が2つになったので、
これでhasMany結合を試すことができます。
ArticleController編集
続いてArticleControllerを編集します。
<?php namespace App\Http\Controllers; use App\Models\Author; use App\Models\Article; use Illuminate\Http\Request; class ArticleController extends Controller { function index() { // ***** 開始 ***** $authors = Author::all(); foreach($authors as $author) { $list = []; foreach($author->articles as $article) { $list[] = $article->title . '/'; } dump('著者:'.$author->name . implode($list)); } // ***** 終了 ***** } }
app>Http>Controllers>ArticleController.php
Authorモデルのデータを全件取得し、
foreachで回します。
"$author->articles"と書かれたところが、
先ほどAuthorモデルを編集した時に作ったarticlesです。
プロパティの形で使います。
(○プロパティ:articles ×メソッド:articles())
articlesの中でhasManyが使われており、
Articleモデルデータを複数取得しています。
implodeメソッドは配列を文字列として連結して表示します。
結果
無事、author_id=1である一郎の記事が2つ表示されました!
今回はここまでです、ありがとうございました〜!