У меня три стола
Таблица статей
id
title
body
categories_id
user_id
Таблица категорий
id
category_name
Таблица пользователей
id
user_name
user_type
Я хочу показывать статьи с их названием категории вместо category_id и user_name вместо user_id. Я пытаюсь сделать этот запрос. Это работает!
$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();
Но я хочу поступить красноречиво. Пожалуйста, как мне это сделать?
->join('categories', 'articles.id', '=', 'categories.id')
? Вместоarticles.id
этого должно бытьarticles.categories_id
. Или я не прав?Ответы:
С Eloquent очень легко получать реляционные данные. Ознакомьтесь со следующим примером с вашим сценарием в Laravel 5.
У нас есть три модели:
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
источник
return Response::json( array( 'total_count' => $count, 'incomplete_results' => false, 'items'=> $articles->toArray() ));
Как это сделать для формата json?join
будет одиночным. Так что ответ @NayZawOo ниже более приемлем.Пытаться:
$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();
источник
$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]);
источник