Laravel关联模型查询

一,多表关联

文章表articles 和user_id,category_id关联

php 复制代码
//with()方法是渴求式加载,缓解了1+N的查询问题,仅需1+1次查询就能解决问题,可以提升查询速度。with部分没有就以null输出,所以可以理解为  多表  left join 查询
//has()和whereHas() 是基于关联关系去过滤模型的查询结果,如果关联模型不符合条件那整体就没有数据。所以可以理解为多表  inner join 查询。
  • 模型关系
php 复制代码
public function user(){
	return $this->belongsTo('App\Models\User','user_id','id');
}


//表2
 public function category(){
	return $this->belongsTo('App\Models\Category','category_id','id');
 }
  • 控制器
php 复制代码
//输出文章表中所有文章数据,如果符合用户id=1,分类name=科技 就输出关联的信息,没有就是null,类似left join 查询
$list = Article::with([
    'user'=>function($query){
        $query->where('id', '=', '1');
    },
    'category'=>function($query){
        $query->where('name', '=', '科技');
    },
    '模型定义的方法名'=>function($query){
     	$query->where('name', '=', '科技');
    }
])
->where('status',1)
->get();
php 复制代码
//输出文章表中符合条件的文章,需要满足用户id=1,分类name=科技 的条件,类似 inner join
//这里要注意,whereHas和has只做筛选,并不返回关系user和category中的数据,但是 with 是返回的。所以,当要返回关系数据时,两者要结合使用。
$list = Article::whereHas('user',function($query){
	$query->where('id', '=', '1');
})
->whereHas('category',function($query){
	$query->where('name', '=', '科技');
})
//这里的with 其实不用再写条件也行,因为前面的whereHas 已经限定了条件了
->with([
    'user'=>function($query){
        $query->where('id', '=', '1');
    },
    'category'=>function($query){
        $query->where('name', '=', '科技');
    }
])
->where('status',1)
->get();

实际使用

php 复制代码
//$request->has() 判断参数是否存在,$request->filled() 判断参数存在且不为空
$id = $request->get('id');
$list = Article::whereHas('user',function($query) use ($id){
	if(!empty($id)){
		$query->where('id', '=', $id);
	}
	
})
->whereHas('category',function($query){
	$query->where('name', '=', '科技');
})
//这里的with 其实不用再写条件也行,因为前面的whereHas 已经限定了条件了
->with([
    'user'=>function($query){
        $query->where('id', '=', '1');
    },
    'category'=>function($query){
        $query->where('name', '=', '科技');
    }
])
->where('status',1)
->get();

二,多表多层级嵌套关联查询

一个company有多个store,一个store有多个goods

php 复制代码
$limit = $request->limit ?? 10;
$query = Goods::query()->where(['status' => 1]);
// 如果存在请求的公司,获取请求公司所有商家的每款产品
if ($request->company_ids){
    $companyIdsArr = explode(',', $request->company_ids);
    $query->whereHas('business', function ($query) use($companyIdsArr){
        $query->whereHas('commpany', function ($query) use($companyIdsArr){
            $query->whereIn('id', $companyIdsArr);
        });
    });
}
$list = $query->orderBy('id', 'desc')->paginate($limit)

输出goods列表包含所属的商家和商家所属的公司

php 复制代码
$builder = Goods::where('status',1);
if($request->filled('type')){
   $builder->where('type',$request->type);
}
//两种都可以
//$builder->with(['business.company'])->get();
$list = $builder->with(['business'=>function($query){
    $query->with('company');
}])->get(); 
相关推荐
数聚天成DeepSData3 小时前
遥感农业数据集下载全攻略
数据库·人工智能·深度学习·机器学习·自然语言处理·数据挖掘
一勺菠萝丶4 小时前
生产环境平滑升级实战-Nginx维护页数据库迁移与安全回滚
数据库·nginx·安全
心静自然凉8004 小时前
MySQL主从同步配置(一主一从)
数据库
haidy ahmed4 小时前
企微复杂审批流反序列化:动态表单解析引擎与EAV存储模型
数据库·人工智能·自动化·企业微信
Lihua奏4 小时前
MVCC:为什么多人同时读写数据,数据库还能不乱
数据库
青山木4 小时前
一把 Redis 分布式锁,踩透四个坑:锁争抢、僵尸锁、锁过期、锁丢失
java·数据库·redis·后端
数智化管理手记5 小时前
智能财务如何减少财务加班?智能财务落地需要哪些工具支撑?
大数据·网络·数据库·数据挖掘·精益工程
IvorySQL5 小时前
深度拆解 IvorySQL 去 O 核心解决方案
数据库·人工智能·postgresql
吴声子夜歌5 小时前
Redis 3.x——客户端
数据库·redis
安卓修改大师5 小时前
安卓修改大师 vs MT管理器:反编译工具终极对决与全景解析
android·人工智能·机器翻译