일대일 연관 정의
여기서는 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(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’],’join类型’);
기본 조인 유형은 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{ } ?>
라고 쓰면 한 가지 주의할 점은 연관 메소드의 명명 규칙은 카멜 케이스인 반면 연관 속성은 일반적으로 소문자 + 밑줄이며 검색 시 시스템이 자동으로 변환한다는 것입니다. 따라서 user_profile 연결 속성을 읽을 때 해당 연결 방법은 userProfile이어야 합니다.
컨트롤러 호출컨트롤러에서 연관 모델을 사용하려면 먼저 모델 클래스를 소개해야 합니다. 예를 들어 위의 관리 모델에서 연관 메소드를 정의했다면 관리자를 소개해야 합니다. 컨트롤러에 모델을 추가합니다.
use app\index\model\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') { //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); } } ?>
출력 결과:
일대다 연관과 일대일 연관의 사용법은 거의 동일하며 차이점은 메소드 이름이 다르다는 것입니다. 일대다 모델에 사용되는 메소드 이름은 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()); } } ?>
就会报出如下错误:
推荐教程:《TP5》
위 내용은 thinkphp 연관 모델의 정의 및 사용 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!