定义一对一关联,例如,一个用户都有一个个人资料
其实程序中的表并非一开始并非是直接动手通过Navicat或者什么工具建表出来的,而是通过ER图,通过图形反应某张表与某张表之间的关系来的再建立相应的表,通过外键关联而来。
首先新建一张表为user,如图所示:
填入内容:
在建立一张表为info
填入内容:
这里我们需要知道,在设定之处我们认为,每一个用户只能够拥有一个个人信息,所以user对于info表之间的关系应当是1对1的关系(也就是一个用户对应一个个人信息),下面我们开始在模型里面进行关联。
在model创建User.php和Info.php:
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
public function profile(){
//hasOne()方法中第一个为关联的模型名称,第二个为关联的外键,
//所以这里分别是Info模型和uid外键
return $this->hasOne('Info','uid');
}
public function Memberdata(){
$Member= new User();
$data=$Member->with('profile')->select();
return $data ;
}
}
控制层代码如下:
<?php
namespace app\index\controller;
use app\index\model\User;
use think\Controller;
class Index extends Controller{
public function index(){
$MemberData= new User();
$data=$MemberData->Memberdata();
return json($data);
}
}
结果如下:
如果只想输入某些字段内容只需要加入field()方法过滤掉即可。
public function profile(){
//hasOne()方法中第一个为关联的模型名称,第二个为关联的外键,
//所以这里分别是Info模型和uid外键
return $this->hasOne('Info','uid')->field('uid,phone,email');
}
如果要根据关联表的查询条件查询当前模型的数据,在控制层可以使用hasWhere方法,例如:
public function index(){
$user = User::hasWhere('profile',['email'=>'cc.com'])->find();
echo $user->username;
}
更多模型一对一关联方法可看官方手册:
https://www.kancloud.cn/manual/thinkphp5/142357
最后由于模型中有关联预载入,大数据量很大的时候,他比jion()方法加载的更加的快速,无论是LeftJion还是RightJion或者InnerJion,所以推荐大家还是多使用模型。