Tengo tres mesas
Tabla de artículos
id
title
body
categories_id
user_id
Tabla de categorías
id
category_name
Tabla de usuarios
id
user_name
user_type
Quiero mostrar artículos con su nombre de categoría en lugar de category_id y user_name en lugar de user_id. Intento como esta consulta. ¡Es un trabajo!
$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();
Pero quiero hacerlo de manera elocuente. Por favor, ¿cómo puedo hacer?
->join('categories', 'articles.id', '=', 'categories.id')
:? En lugar dearticles.id
debería serloarticles.categories_id
. ¿O me equivoco?Respuestas:
Con Eloquent es muy fácil recuperar datos relacionales. Consulte el siguiente ejemplo con su escenario en Laravel 5.
Tenemos tres modelos:
1) Artículo (pertenece al usuario y categoría)
2) Categoría (tiene muchos artículos)
3) Usuario (tiene muchos artículos)
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'); } }
Debe comprender la relación de su base de datos y la configuración en modelos. El usuario tiene muchos artículos. La categoría tiene muchos artículos. Los artículos pertenecen a usuario y categoría. Una vez que configure las relaciones en Laravel, será fácil recuperar la información relacionada.
Por ejemplo, si desea recuperar un artículo utilizando el usuario y la categoría, deberá escribir:
$article = \App\Models\Article::with(['user','category'])->first();
y puedes usar esto así:
//retrieve user name $article->user->user_name //retrieve category name $article->category->category_name
En otro caso, es posible que deba recuperar todos los artículos dentro de una categoría, o recuperar todos los artículos de un usuario específico. Puedes escribirlo así:
$categories = \App\Models\Category::with('articles')->get(); $users = \App\Models\Category::with('users')->get();
Puede obtener más información en http://laravel.com/docs/5.0/eloquent
fuente
return Response::json( array( 'total_count' => $count, 'incomplete_results' => false, 'items'=> $articles->toArray() ));
¿cómo podría hacerlo para el formato json?join
será única. Entonces, la respuesta de @NayZawOo a continuación es más aceptable.Tratar:
$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();
fuente
$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]);
fuente