私は3つのテーブルがあります
id
title
body
categories_id
user_id
id
category_name
id
user_name
user_type
Category_idの代わりにcategory_id、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();
しかし、私は雄弁な方法でやりたいです。どうすればいいですか?
Eloquentを使用すると、リレーショナルデータを非常に簡単に取得できます。 Laravel 5のシナリオで次の例をチェックアウトします。
次の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 をご覧ください。
試してください:
$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();