那么本日的问题是,如何关联3张表进行操作?

学习韶光

假设现在有3张表,分别是 articles 文章表,category 分类表,还有一个是 users 用户表。
关联度最深的还数 articles,由于它要存储该文章的分类,还有发布者。
字段如下:

id title body categories_id user_id

为相识释问题,我们精简了表构造。
接着是 分类表 category 的字段:

php多表联合查询3分钟短文  Laravel若何改革庞杂的多表结合查询这很高效 Vue.js

id category_name

末了是发布者 users 表字段:

id user_name user_type

好了准备事情做完了。
假设要查询一篇文章,且须要连带查询出该文章的分类信息,发布者信息,最直不雅观的是利用 join 关联查询。
类似下面的代码办法:

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

但是这样写组装的SQL语句太繁芜了。
而且一点也不laravel。
以是我们考试测验着利用laravel eloquent orm 办法实现。

首先是创建表对应的模型 User.php,

<?phpnamespace App\Model;use Lib\Database\Model;use App\Model\User;use App\Model\Category;class Article extends Model{ protected $table = 'articles'; public function user() { return $this->belongsTo(User::class, 'user_id', 'id'); } public function category() { return $this->belongsTo(Category::class, 'category_id', 'id'); }}

再接着是 User 用户模型:

<?phpnamespace App\Model;use Lib\Database\Model;use App\Model\Article;class User extends Model{ protected $table = 'users'; public function articles() { return $this->hasMany(Article::class, 'user_id', 'id'); }}

末了是分类 Category 模型:

<?phpnamespace App\Model;use Lib\Database\Model;use App\Model\Article;class Category extends Model{ protected $table = 'category'; public function articles() { return $this->hasMany(Article::class, 'category_id', 'id'); }}

经由上述3个模型的关联关系铺垫,现在查询一篇文章 articles, 同时关联上 users,category 表,就可以利用下面的写法:

$article = \App\Model\Article::with(['user','category'])->first();

上述语句在组装SQL的时候,先查询articles表的内容,然后分别利用 articels 查询结果的 id 列表用作筛选条件, 查询出 user 表,category 表,有三次SQL查询。

实在我们可以精准掌握SQL实行的机遇,比如只有在我们须要利用 user 信息的时候, 就可以这样利用:

$article = \App\Model\Article::first();$user_name = $article->user->user_name;

上述方法,只有在调用 Article 模型的关联模型时,才会触发查询。
效率要高一些。
同样的方法也适用于 Category 模型:

$category_name = $article->category->category_name;写在末了

本文通过三张表的关联查询,利用laravel供应的模型关联办法,优雅而且可重用地实现了需求。
这远比利用原生查询来的效率高,可操作性也更强。

Happy coding :-)

我是 @程序员小助手,持续分享编程知识,欢迎关注。