如何通过Laravel雄辩的模型加入三个表


85

我有三张桌子

物品表

 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();

但是我想用口才来做。拜托,我该怎么办?


1
如何创建连接这些表的视图,然后创建仅从中读取的Eloquent模型?减少了代码复杂度,您可以获利,无需付出任何努力。
NB

1
所有其他相关模型和功能都可以与Eloquent模型一起使用。所以我需要用口才。
2015年

1
您在这里误解了->join('categories', 'articles.id', '=', 'categories.id')吗?代替articles.id它应该是articles.categories_id。还是我错了?
FreeLightman 2015年

Answers:


140

使用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了解更多


感谢您的答复,但我使用laravel 4,并希望以json格式返回数据。就像这些return Response::json( array( 'total_count' => $count, 'incomplete_results' => false, 'items'=> $articles->toArray() ));,我该 如何处理json格式?
2015年

不管所有代码在Laravel 4中都可以工作,只是您需要删除名称空间,并且$ articles-> toArray()都可以工作,请尝试
Anand Patel 2015年

谢谢兄弟,这是工作,您救了我的命:)。对不起,我迟到了,因为我昨天不在电脑旁。
2015年

4
我不确定,但是似乎这种方式(使用雄辩)会生成3个查询。而带有custom的查询join将是单个查询。因此,下面@NayZawOo的答案是可以接受的。
FreeLightman

如果我不想像$ article-> category-> category_name那样访问它,而使用$ article-> categoryName这样的别名,该怎么办呢?
Herokiller '16

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对象格式return。因为我需要尝试$ articles-> count()和$ articles-> offset($ offset); $ articles-> get(array('id','title','body')); 但是,您的方法无法应用这些对象函数。感谢您的支持。
2015年

1
返回响应:json($ articles);
Nay Zaw Oo 2015年

尽管这不是雄辩的方法,但是这是按外部表中的字段排序的唯一方法。(我不建议这样做,但有时是必需的)。因此,我认为这仍然是一个非常有效的答案。(这个问题问到如何加入表,雄辩的语言却从未加入他们在原来的查询。)
长柄水杓


“虽然这不是雄辩的方法,但是如果按外国表中的字段进行排序,这是唯一的方法。” 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]);

上面的查询具有解决此问题的完整性约束违规错误
Akshay Kashyap'Feb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.