ThinkPHP5模型中的一对一关联

定义一对一关联,例如,一个用户都有一个个人资料
其实程序中的表并非一开始并非是直接动手通过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,所以推荐大家还是多使用模型。

猜你喜欢

转载自blog.csdn.net/hgb24660/article/details/100162940