ThinkPHP5 一个字段对应多个条件查询的解决办法

举例子:

同时查询字段学号为10010,10011的学生的所有信息?

sql语句:

select * from stu where stu_num=10010 or stu_num=10011;

tp5写法:

db("stu")->whereOr("stu_num",10010)

->whereOr("stu_num",10011)

->select();

思考:

如果根据100个学生的学号信息查询呢?(给定了学号)

tp5

$data //这里data指给的所有学号

db("stu")->where("stu_num",“in",$data)

->select();

对,就是用in

sql写法,同理

### ThinkPHP8 中多对多模型查询及主表子表组合条件查询ThinkPHP8中,处理多对多关系以及涉及主表和子表的组合条件查询可以通过定义关联模型并利用内置的查询构建器来完成。 #### 定义多对多关系 为了建立一个多对多的关系,在`app\model\`目录下创建相应的模型类文件。假设存在两个实体——文章(`Article`)与标签(`Tag`)之间的多对多联系,则可以在各自的模型内声明这种关系: 对于 `Article.php` 文件: ```php namespace app\model; use think\Model; class Article extends Model { public function tags() { return $this->belongsToMany(Tag::class); } } ``` 同样地,在 `Tag.php` 文件里也需要设置反向关联: ```php namespace app\model; use think\Model; class Tag extends Model { public function articles() { return $this->belongsToMany(Article::class); } } ``` 上述代码片段展示了如何基于命名空间定义了属于同一个应用模块下的两个相互关联的数据表结构[^1]。 #### 使用中间表进行查询 当涉及到具体操作时,比如想要获取某篇文章所拥有的全部标签或者相反情况,可以借助于已经定义好的方法来进行访问: ```php // 获取特定ID的文章及其对应的标签列表 $articleId = 1; $articleWithTags = (new \app\model\Article)->with(['tags'])->find($articleId); foreach ($articleWithTags['tags'] as $tag){ echo "Tag Name: {$tag->name}\n"; } // 或者反过来找带有某个标签的所有文章 $tagName = 'thinkphp'; $articlesWithTag = (new \app\model\Tag)->where('name','=',$tagName)->with(['articles'])->select(); foreach ($articlesWithTag as $item){ foreach ($item['articles'] as $art){ echo "Article Title:{$art->title}\n"; } } ``` 这段脚本说明了怎样通过调用`with()`函数加载相关联的对象,并且能够进一步筛选出满足一定条件的结果集[^2]。 #### 实现复杂的组合条件查询 如果要在一个查询过程中加入更多样化的约束条件(例如时间范围、状态标记等),则可以直接链式添加更多的`where`表达式到原有的基础上去形成最终SQL语句。考虑到可能存在的OR逻辑需求,还可以采用闭包形式传递复合型谓词参数给`whereOr`或类似的API接口: ```php $queryBuilder = new Query(); $resultSet = $queryBuilder ->table('main_table') ->alias('mt') // 如果有必要的话为主表取个别名以便后续引用 .join('sub_table st', 'st.main_id=mt.id') // 加入子表连接 ->field('mt.*, COUNT(st.*) AS sub_count') // 自定义输出字段 ->group('mt.id') // 聚合分组依据 ->having('sub_count > ?', [0]) // 对聚合结果施加额外限制 ->order('mt.create_time DESC') // 排序规则 ->where(function($query) use (&$params){ $query->where('mt.status','=',1); // 添加AND类型的简单条件 if(isset($params['start_date'])){ $query->where('mt.update_time','>=',$params['start_date']); } if(isset($params['end_date'])) { $query->where('mt.update_time','<=',$params['end_date']); } }) ->whereOr(function($query) use (&$otherParams){ $query->whereIn('mt.type',['A','B']); // OR条件下的一系列选项匹配 if(!empty($otherParams)){ foreach($otherParams as $key=>$value){ $query->orWhere("mt.$key","like", "%$value%"); } } }) ->page(1,10) // 分页控制 ->select(); // 执行查询获得结果集 ``` 此部分解释了如何灵活运用`Query Builder`模式构造复杂查询语句,包括但不限于联合其他表格、计算统计量、实施日期区间过滤等功能特性][^[^34]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值