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

你可能感兴趣的:(PHP,java,服务器,servlet)