エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

hasOneとhasManyとbelongsTo【56日目】

リレーションについてはこれ

Eloquent:リレーション 5.1 Laravel

こんなんできる

任意のポストについたコメントを取得する DB

posts
id|post|
1|aaa|
2|bbb|

comments
id|post_id|string|
1|1|aaaa|
2|1|iiii|
3|2|uuuu|

ポスト1には、aaaa,iiiiの2つのコメント。
ポスト2には、uuuuという1つのコメント。

$comments = App\Post::find(1)->comments;

foreach ($comments as $comment) {
    echo $comment->string . "\n";
}
aaaa
iiii

ポスト1のコメント取得出来た。

リレーションを設定すると、面倒なqueryでのleftJoinとか書かなくていい。

書き方

公式コピペ。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    /**
     * ブログポストのコメントを取得
     */
    public function comments()
    {
        return $this->hasMany('App\Comment');
    }
}

モデルにhasManyでリレーションつける。

hasOneは?

同じ感じに書きます。

今回、post1個に、commentが2つ。1対多だからhasMany。

1対1ならhasOne。

belongsToって?

逆に、commentからpostを引っ張ってきたいときに書く。書き方一緒。

DB設計の注意。

commentsのテーブルにpost_idってテーブル名の単数_idで書いてたら、さっきの書き方でOK。

もし、外部キーとかが別の名前なら

public function user()
{
    return $this->belongsTo('App\User', '外部キーのカラム名', '親元のid扱いのカラム名');
}

って感じで。

ややこしいしメンテ面倒なのでカラム名の規則は守りましょう。

日記

やばい。もうadvent calender迫ってる。一文字も書いてない。

とりあえず今日は疲れたので( ˘ω˘)スヤァ