Laravelの雄弁なモデルで3つのテーブルを結合する方法


85

私は3つのテーブルを持っています

記事表

 id
 title
 body
 categories_id
 user_id

カテゴリ表

  id
  category_name

ユーザーテーブル

 id
 user_name
 user_type

category_idの代わりにcategorynameを、user_idの代わりにuser_nameを使用して記事を表示したいこれらのクエリのように試します。

$articles =DB::table('articles')
                ->join('categories', 'articles.id', '=', 'categories.id')
                ->join('users', 'users.id', '=', 'articles.user_id')
                ->select('articles.id','articles.title','articles.body','users.username', 'category.name')
                ->get();

しかし、私は雄弁な方法でやりたいです。どうすればいいですか?


1
それらのテーブルを結合するビューを作成してから、それから読み取るだけのEloquentモデルを作成するのはどうですか?コードの複雑さが軽減され、利益が得られます。ハードワークは必要ありません。
NB

1
他のすべての関連するモデルと機能は、EloquentModelと連携して機能します。だから私はEloquentWayを使う必要があります。
いや

1
あなたはここで間違っています->join('categories', 'articles.id', '=', 'categories.id')か:?代わりにarticles.id、それはする必要がありますarticles.categories_id。または私は間違っていますか?
FreeLightman 2015

回答:


140

Eloquentを使用すると、リレーショナルデータを非常に簡単に取得できます。Laravel5のシナリオで次の例を確認してください。

3つのモデルがあります。

1)記事(ユーザーとカテゴリに属する​​)

2)カテゴリー(記事が多い)

3)ユーザー(多くの記事があります)


1)Article.php

<?php

namespace App\Models;
 use Eloquent;

class Article extends Eloquent{

    protected $table = 'articles';

    public function user()
    {
        return $this->belongsTo('App\Models\User');
    }

    public function category()
    {
        return $this->belongsTo('App\Models\Category');
    }

}

2)Category.php

<?php

namespace App\Models;

use Eloquent;

class Category extends Eloquent
{
    protected $table = "categories";

    public function articles()
    {
        return $this->hasMany('App\Models\Article');
    }

}

3)User.php

<?php

namespace App\Models;
use Eloquent;

class User extends Eloquent
{
    protected $table = 'users';

    public function articles()
    {
        return $this->hasMany('App\Models\Article');
    }

}

データベースの関係とモデルの設定を理解する必要があります。ユーザーは多くの記事を持っています。カテゴリには多くの記事があります。記事はユーザーとカテゴリに属します。Laravelでリレーションシップを設定すると、関連情報を簡単に取得できるようになります。

たとえば、ユーザーとカテゴリを使用して記事を取得する場合は、次のように記述する必要があります。

$article = \App\Models\Article::with(['user','category'])->first();

そして、あなたはこれを次のように使うことができます:

//retrieve user name 
$article->user->user_name  

//retrieve category name 
$article->category->category_name

別のケースでは、カテゴリ内のすべての記事を取得するか、特定のユーザーの記事をすべて取得する必要がある場合があります。あなたはそれをこのように書くことができます:

$categories = \App\Models\Category::with('articles')->get();

$users = \App\Models\Category::with('users')->get();

詳細については、http://laravel.com/docs/5.0/eloquentをご覧ください。


返信ありがとうございますが、私はlaravel 4を使用しており、json形式でデータを返したいと思っています。これらのreturn Response::json( array( 'total_count' => $count, 'incomplete_results' => false, 'items'=> $articles->toArray() ));ようにjson形式で どうすればよいですか?
いや

すべてのコードがLaravel4で機能する場合でも、名前空間を削除する必要があり、$ articles-> toArray()も同じように機能します。試してみてください
Anand Patel

兄弟に感謝します。それは仕事であり、あなたは私の命を救います:)。昨日はパソコンの近くにいないので返信が遅くなってすみません。
2015年

4
よくわかりませんが、この方法(雄弁を使用)では3つのクエリが生成されるようです。カスタムjoinのクエリは単一になりますが。したがって、以下の@NayZawOoによる回答の方が受け入れられます。
FreeLightman 2015

$ article-> category-> category_nameのようにアクセスしたくないが、$ article-> categoryNameのようなエイリアスを使用する場合はどうすればよいですか?その場合、雄弁なクエリを作成するにはどうすればよいですか?
ヒーローキラー2016

23

試してみてください:

$articles = DB::table('articles')
            ->select('articles.id as articles_id', ..... )
            ->join('categories', 'articles.categories_id', '=', 'categories.id')
            ->join('users', 'articles.user_id', '=', 'user.id')

            ->get();

jsonオブジェクト形式を返したい。$ articles-> count()と$ articles-> offset($ offset);を試す必要があるためです。$ articles-> get(array( 'id'、 'title'、 'body')); しかし、あなたのやり方ではそれらのオブジェクト関数を適用することはできません。あなたのサポートに感謝します。
いいえ2015年

1
Response:json($ articles);を返します。
Nay Zaw Oo 2015

これは雄弁な方法ではありませんが、外部テーブルのフィールドで並べ替える場合の唯一の方法です。(これはお勧めしませんが、必要な場合があります)。そのため、これはまだ非常に有効な答えだと思います。(質問はテーブルを結合する方法を尋ねました、雄弁な方法は実際には元のクエリでそれらを結合することはありません。)
Skeets 2017

このパッケージは、github.com
fico7489 /

「これは雄弁な方法ではありませんが、外部テーブルのフィールドで並べ替える場合の唯一の方法です。」Skeets、唯一の方法を言うとき、laravelのドキュメントではこの重要な情報が省略されていると言っていますか?
グレン

3
$articles =DB::table('articles')
                ->join('categories','articles.id', '=', 'categories.id')
                ->join('user', 'articles.user_id', '=', 'user.id')
                ->select('articles.id','articles.title','articles.body','user.user_name', 'categories.category_name')
                ->get();
return view('myarticlesview',['articles'=>$articles]);

上記のクエリには、この回答で解決された整合性制約違反エラーがあります
AkshayKashyap20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.