Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Laravel】Eloquentのリレーション③ hasMany結合について

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メソッドは配列を文字列として連結して表示します。

結果

f:id:hiyotama:20181109175751p:plain

無事、author_id=1である一郎の記事が2つ表示されました!

今回はここまでです、ありがとうございました〜!