美文网首页
Laravel如何改造复杂的多表联合查询,这很高效!

Laravel如何改造复杂的多表联合查询,这很高效!

作者: 大萝卜2022 | 来源:发表于2023-02-12 15:57 被阅读0次

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

id title body categories_id user_id

为了说明问题,我们精简了表结构。接着是 分类表 category 的字段:

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,

<?php
namespace 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 用户模型:

<?php namespace 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 模型:

<?php
namespace 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提供的模型关联方式,优雅而且可重用地实现了需求。 这远比使用原生查询来的效率高,可操作性也更强。

相关文章

  • mysql---多表查询

    判断数据表中的分数是否及格: 多表联合查询---左连接 统计个数 嵌套查询: 多表查询:

  • 多表联合查询

    MySQL中基本的多表连接查询教程Mysql脚本之家 var tougao="goldensun";var lmn...

  • SQL查询语句1

    复杂查询 = 简单查询 + 限定查询 + 查询排序 + 多表查询 + 分组统计查询 + 子查询。 面对所有的复杂查...

  • 101、【JavaEE】【Mybatis】复杂查询

    1、概述 复杂查询即多表查询、嵌套查询。 2、多表查询 2.1、一对一 在中使用 2.2、一...

  • 不可置信!SQL 优化终于干掉了“distinct”

    sql 优化之多表联合查询干掉 “distinct” 去重关键字 所以需要把多表的子查询的 sql 结构进行优化。...

  • mysql复杂查询--多表查询

    多表查询 多表查询是指基于两个和两个以上的表或是视图的查询.在实际应用中,查询单个表可能不能满足你的需求,(如显示...

  • arango增删改查

    arango实践 插入数据 修改数据 插入数据 查询数据 复杂查询 多表查询

  • mysql基础之多表查询和外键约束

    什么是多表查询 从多张表中联合查询出数据 为什么要使用多表查询 需要查询多张表中的数据,通过一张表查询是不完整的 ...

  • DQL -- 多表联合查询

    现实生活中,我们需要查询的数据并不独立存在在某一张表中,此时就需要进行多表联合,进行查询操作了。多表联合主分四种:...

  • sqlalchemy多表联合查询

    sqlalchemy多表联合查询(inner outer join 左右连接)详解 按用户名摸糊查询 左外联接(l...

网友评论

      本文标题:Laravel如何改造复杂的多表联合查询,这很高效!

      本文链接:https://www.haomeiwen.com/subject/sjydkdtx.html