Mam trzy stoliki
Tabela artykułów
id
title
body
categories_id
user_id
Tabela kategorii
id
category_name
Tabela użytkowników
id
user_name
user_type
Chcę wyświetlać artykuły z nazwą kategorii zamiast category_id i user_name zamiast user_id. Próbuję odpowiedzieć na to zapytanie. To działa!
$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();
Ale chcę to zrobić elokwentnie. Proszę, jak mogłem zrobić?
->join('categories', 'articles.id', '=', 'categories.id')
? Zamiastarticles.id
tego powinno byćarticles.categories_id
. A może się mylę?Odpowiedzi:
Dzięki Eloquent bardzo łatwo jest odzyskać dane relacyjne. Sprawdź następujący przykład ze swoim scenariuszem w Laravel 5.
Mamy trzy modele:
1) Artykuł (należy do użytkownika i kategorii)
2) Kategoria (zawiera wiele artykułów)
3) Użytkownik (zawiera wiele artykułów)
1) Artykuł.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'); } }
Musisz zrozumieć relacje z bazą danych i konfigurację modeli. Użytkownik ma wiele artykułów. Kategoria zawiera wiele artykułów. Artykuły należą do użytkownika i kategorii. Po skonfigurowaniu relacji w Laravel łatwo będzie odzyskać powiązane informacje.
Na przykład, jeśli chcesz pobrać artykuł za pomocą użytkownika i kategorii, musisz napisać:
$article = \App\Models\Article::with(['user','category'])->first();
i możesz użyć tego w ten sposób:
//retrieve user name $article->user->user_name //retrieve category name $article->category->category_name
W innym przypadku może zajść potrzeba pobrania wszystkich artykułów w kategorii lub wszystkich artykułów określonego użytkownika. Możesz to napisać tak:
$categories = \App\Models\Category::with('articles')->get(); $users = \App\Models\Category::with('users')->get();
Możesz dowiedzieć się więcej na http://laravel.com/docs/5.0/eloquent
źródło
return Response::json( array( 'total_count' => $count, 'incomplete_results' => false, 'items'=> $articles->toArray() ));
Jak mogę zrobić dla formatu json?join
będzie pojedyncze. Więc odpowiedź @NayZawOo poniżej jest bardziej akceptowalna.Próbować:
$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();
źródło
$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]);
źródło