本文主要记录在做关联查询中遇到的问题:关联查询的数据查询不到。
通过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