Thinkphp6一对一关联

本文主要记录在做关联查询中遇到的问题:关联查询的数据查询不到。

通过hasOne进行关联查询定义:

一、查询不到关联表数据

刚开始因为模型中字段名小写,就怎么也查询不到关联表的数据,就是下面的id等字段小写

public function oneAuth()
    {
        return $this->hasOne(OneAuth::class, 'id', 'id')->bind(['pro', 'tbzt','osj'=>'sj']);
    }

修改字段名为大写即可正常查询到数据:

public function oneAuth()
    {
        return $this->hasOne(OneAuth::class, 'ID','ID')->bind(['PRO', 'TBZT','OSJ'=>'SJ']);
    }
public function twoAuth()
    {
        return $this->hasOne(TwoAuth::class, 'ID','ID')->bind(['PRO', 'TTBZT','TSJ'=>'SJ']);
    }

二、关联表和主表有相同的字段

使用bind可以将子表查询的字段直接绑定到主表上,不用再处理二维数组。进行字段绑定的时候,如果关联表和主表字段名称相同,则会报错:

ORA-00918: column ambiguously defined

可以通过定义字段别名解决,例如SJ字段重名,在进行bind的时候,定义别名OSJ:

return $this->hasOne(OneAuth::class, 'ID','ID')->bind(['PRO', 'TBZT','OSJ'=>'SJ']);

三、使用withJoin进行连接查询

在使用withJoin进行连接查询的时候,有两点要注意:

1.如果主表和子表的查询字段有重名,则会提示查询关键字错误,可以通过在where条件的字段上带上模型名,例如下面代码,在id字段前加上md_test模型名。模型名采用驼峰命名法,作为标明的时候要转为下划线的方式(大写转换为下划线加小写)。

 $res = MdTest::withJoin('OneAuth','LEFT')->where([['md_test.id','like',$uId.'%'],['md_test.zt','=',1]])->select();

2.查询出来的子表数据是直接添加在主表数据下面的,例如上面的查询结果是:

array (size=1)
  0 => 
    array (size=21)
      'ZT' => string '1' (length=1)
      'YXQ' => string '01-SEP-25' (length=9)
      'ID' => string '1111111111' (length=10)
      'SJ' => string '14-NOV-21 04.50.45.772498 PM' (length=28)
      'ONE__SJ' => string '14-NOV-21 10.06.17.572411 AM' (length=28)
      'ONE__ID' => string '1111111111' (length=10)
      'OneAuth' => null

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷WEB应用 开发和简化企业级应用开发而诞生的。拥有众多的优秀功能和特性,经历了三年多发展的同时,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和 改进,众多的典型案例确保可以稳定用于商业以及门户级的开发。 ThinkPHP5.1对底层架构做了进一步的改进,减少依赖,其主要特性包括: 采用容器统一管理对象 支持Facade 注解路由支持 路由跨域请求支持 配置和路由目录独立 取消系统常量 助手函数增强 类库别名机制 增加条件查询 改进查询机制 配置采用二级 依赖注入完善 支持PSR-3日志规范 中间件支持(V5.1.6+) Swoole/Workerman支持(V5.1.18+) ThinkPHP5的运行环境要求PHP5.6以上,兼容PHP8.0。 更新日志: V5.1.40 LTS(2020-10-09) 本版本为常规更新,主要包括: 改进redis驱动`has`方法 修正XA事务 修正`HasManyThrough`关联 增加mysql json类型字段->>方式获取支持 改进路由加载 避免加载编辑器临时文件影响 修复关联模型的属性直接附加到当前模型,当关联模型字段名为name时获取的值为模型的属性name值 修复多态关联预加载`field`无效 改进Collection类的`column`方法的PHP兼容性问题 改进mysql驱动 改进`parseclosure`方法 SoftDelete删除条件做空判断 改进验证类`append`方法
ThinkPHP6中,实现一对多关联查询的方法是使用hasMany模式。具体设置方式如下: 1. 在主表的模型中使用hasMany方法进行关联设置: ``` public function 附表名() { return $this->hasMany(附表模型::class, '外键字段', '主键字段'); } ``` 例如: ``` public function profile() { return $this->hasMany(Profile::class, 'user_id', 'id'); } ``` 2. 进行一对多关联查询: ``` $user = UserModel::find(主表记录的id); return json($user->附表关联方法名); ``` 例如: ``` $user = UserModel::find(19); return json($user->profile); ``` 3. 进行数据筛选查询: ``` $user->附表关联方法名->where('条件字段', '条件操作符', '条件值'); ``` 例如: ``` $user->profile->where('id', '>=', 10); ``` 4. 使用has()方法查询满足条件的主表记录: ``` UserModel::has('附表关联方法名', '条件操作符', '条件值')->select(); ``` 例如: ``` UserModel::has('profile', '>=', 2)->select(); ``` 5. 使用together()方法,在删除主表记录时,同时删除关联的附表记录: ``` $user = UserModel::with('附表关联方法名')->find(主表记录的id); $user->together(['附表关联方法名'])->delete(); ``` 例如: ``` $user = UserModel::with('profile')->find(22); $user->together(['profile'])->delete(); ``` 以上就是在ThinkPHP6中实现一对多关联查询的方法。希望对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值