일대일 연관 정의
여기서는 thinkphp5 환경을 구성했고 데이터베이스 연결이 정상이라고 가정합니다. 모델을 통해 두 테이블을 연결한 다음 컨트롤러를 호출하여 두 테이블의 정보를 가져오고 싶습니다.
이제 관리자 테이블 pwn_admin과 관리자 정보 테이블 pwn_admin_message 두 테이블을 준비했습니다. 이해하기 쉽도록 두 테이블의 테이블 구조도 게시했습니다.
다음은 두 테이블의 테이블 구조 정보입니다.
CREATE TABLE `pwn_admin` ( `id` int(6) NOT NULL AUTO_INCREMENT, `user` varchar(30) NOT NULL DEFAULT '', `password` varchar(50) NOT NULL DEFAULT '', `name` varchar(50) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
CREATE TABLE `pwn_admin_message` ( `id` int(6) NOT NULL AUTO_INCREMENT, `email` varchar(30) NOT NULL DEFAULT '', `mobile` varchar(50) NOT NULL DEFAULT '', `aid` int(11) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
모델 파일 생성
다음 단계는 두 데이터 테이블에 해당하는 새로운 모델 클래스 파일을 생성하는 것입니다. 모듈 아래에 새 모델 디렉터리를 만든 다음 두 개의 새 파일을 만들고 해당 테이블에 따라 이름을 지정합니다.
모델 명명
모델 클래스의 명명 규칙은 데이터 테이블 이름에서 테이블 접두사를 제거하는 것입니다. , 카멜 케이스 이름 지정 및 첫 글자 대문자를 사용합니다. 예를 들어 위 두 테이블의 테이블 접두사는 pwn_이므로 모델 이름에서 생략해야 합니다. 따라서 pwn_admin 테이블의 모델 클래스 이름은 Admin이고 pwn_admin_message의 모델 클래스 이름은 AdminMessage입니다. hasOne 메서드의 매개 변수에는
hasOne('관련 모델 이름', '외부 키 이름', '기본 키'가 포함됩니다. name', ['Model alias Definition'],'join type');
기본 조인 유형은 INNER
모델 정의입니다관리 모델은 pwn_admin 테이블에 해당합니다
<?php namespace app\index\model; use think\Model; class Admin extends Model{ function AdminMessage(){ //aid为外键id是adminmessage表关联admin表的外键 //id是 admin表的主键 return $this->hasOne('AdminMessage','aid','id')->field('id,coltype,auth,name,intro,xuhao,pid,pname'); } } ?>
관리 모델이 정의한 후 연관된 메소드는 AdminMessage 모델에서 사용할 수 있습니다. 해당 메소드를 작성할 필요는 없지만 pwn_admin_message 테이블에 해당하는 빈 모델이 하나 이상 있어야 합니다.
따라서 이 모델에<?php namespace app\index\model; use think\Model; class AdminMessage extends Model{ } ?>
Controller call
컨트롤러에서 연관 모델을 사용하려면 모델 클래스를 먼저 도입해야 합니다. 예를 들어 위의 관리 모델에서 연관 메소드를 정의했다면 관리 모델을 도입해야 합니다. 컨트롤러.
use appindexmodelAdmin
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class Index extends Controller { /** * @param string $name */ public function index($name='name') { //get 1 是获取id为 1 的数据 //find() 是查找 //toArray() 是获取到的数据转为数组 $admin= Admin::get(1); var_dump($admin->find()->toArray()); } ?>
실행 결과:
결과가 이와 같다면 관리자 관리자 테이블에 데이터만 있는 것이므로 걱정하지 마세요. 이는 정상입니다. 관련 테이블 pwn_admin_message의 데이터를 가져오려면 먼저 방금 정의한 AdminMessage() 모델 메서드를 호출한 다음 find() 메서드를 가리켜 데이터를 가져와야 합니다.
참고:
이 find() 메소드는 이 메소드를 추가하지 않았기 때문에 전체 관리자 정보를 얻을 수 없습니다.
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { $admin= Admin::get(1); //查询出pwn_admin_message 表aid为 1 的一条数据,然后转数组。 $admin= $admin->AdminMessage->find()->toArray(); var_dump($admin); } } ?>
결과는 다음과 같습니다.
테스트이므로 편의상 숫자를 직접 사용하지 않고 텍스트 코드를 사용하여 더욱 직관적입니다.
hasWhere() 메소드:
연관 테이블의 쿼리 조건을 기반으로 현재 모델의 데이터를 쿼리하려면 hasWhere 메소드를 사용할 수 있습니다. 예:
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { $admin=Admin::hasWhere('AdminMessage',['email'=>'guanliB@ggg.com']); $admin=$admin->find()->toArray(); var_dump($admin); } } ?>
출력 결과:
일대다 연관 정의
One pair 다중 연관과 일대일 연관의 사용법은 거의 동일하며 차이점은 메소드 이름이 다르다는 것입니다. 일대다 모델에 사용되는 메소드 이름은 hasMany입니다. hasMany와 hasOne의 사용 방법과 매개 변수는 기본적으로 동일합니다.
hasMany 매개변수는 다음과 같습니다.
hasMany('관련 모델 이름', '외래 키 이름', '기본 키 이름', ['모델 별칭 정의'])여전히 위의 두 테이블을 예로 사용합니다. , 그러나 일대다 연결을 일치시키려면 pwn_admin_message의 내용과 지원 필드를 약간 수정해야 합니다. 여러 개의 휴대폰 번호와 여러 개의 이메일 주소를 가진 관리자로 변경하세요.
이해를 돕기 위해 두 테이블의 데이터 내용을 스크린샷으로 올려드립니다.
아래 그림은 pwn_admin_message 테이블의 내용입니다:
아래 그림은 pwn_admin 테이블의 내용입니다:
有几个管理员没有数据,不过没关系足够测试就可以了。好了废话不多说,开始进入正题。
相信大家一看就知道下面这个是admin模型的内容,对应的是pwd_admin 表
<?php namespace app\index\model; use think\Model; class Admin extends Model{ public function AdminMessage(){ //pid为外键id是adminmessage表关联admin表的外键 //id是 admin表的主键 return $this->hasMany('AdminMessage','aid','id'); } }
而这下面这个是 AdminMessage 对应的是哪张表我就不说了。这和一对一关联一样也可以是个空模型
<?php namespace app\index\model; use think\Model; class AdminMessage extends Model{ /* function Admin(){ return $this->belongsTo('Admin','aid','id'); } */ } ?>
控制器调用,这回就有点不一样了。因为返回的数据是一个二维数组里面包含了多个对象所以需要把数组循环出来并把对象在转为数组才能输出
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { $admin= Admin::get(1); //查找出 pwn_admin_message 表关联aid为1是所有数据 $admin= $admin->AdminMessage()->select(); for($i=0;$i<count($admin);$i++){ var_dump($admin[$i]->toArray()); } } } ?>
输出结果:
还有两个函数也顺便说一下了,一个是 hasWhere 还有一个 has 这两个都是根据关联条件来查询的,通俗点讲就是根据关联到 pwd_admin 表,的 pwn_admin_message 表字段的条件来查询的。如果换过来用pwd_admin里的字段作为条件查询的话就会报错。
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { // $admin= Admin::get(1); $list= Admin::hasWhere('AdminMessage',['aid'=>1])->select(); $list1=Admin::has('AdminMessage',['aid'=>2])->select(); var_dump($list1[0]->toArray()); } } ?>
这样子关联得出的结果是正常的:
如果按 pwd_admin 表的字段做为搜索条件就会报错。比如我用一个 pwn_admin_message 没有的字段,用user字段来做为条件查询试试。
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { // $admin= Admin::get(1); // $list= Admin::hasWhere('AdminMessage',['aid'=>1])->select(); $list1=Admin::has('AdminMessage',['user'=>'jiehechen123'])->select(); var_dump($list1[0]->toArray()); } } ?>
就会报出如下错误:
推荐教程:thinkphp教程
위 내용은 thinkphp5의 연관 모델 정의 및 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!