1 対 1 の関連付けの定義
thinkphp5 環境が構成されており、データベース接続に問題がないことを前提としています。モデルを通じて 2 つのテーブルを関連付け、コントローラーを呼び出して 2 つのテーブルの情報を取得したいと考えています。
管理者テーブル pwn_admin と管理者情報テーブル pwn_admin_message の 2 つのテーブルを用意しましたが、分かりやすくするために 2 つのテーブルのテーブル構造を載せておきます。
以下は 2 つのテーブルのテーブル構造情報です:
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;
モデル ファイルの構築
次のステップは、新しいモデル クラスを作成することです。 2 つのデータ テーブル ドキュメントに対応します。モジュールの下に新しいモデル ディレクトリを作成し、次に 2 つの新しいファイルを作成し、対応するテーブルに従って名前を付けます。
モデルの名前付け
モデルの名前付け規則モデル クラスはテーブルを削除します。プレフィックス付きのデータ テーブル名は、最初の文字が大文字のキャメル ケースで名前が付けられます。たとえば、上記の 2 つのテーブルのテーブル プレフィックスは 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()); } ?>
次のブラウザにアクセスして結果を確認できます:
結果がこのような場合、admin 管理者テーブルのデータのみが利用可能です。 、これは正常な現象ですので、心配しないでください。関連するテーブル 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); } } ?>
出力結果:
1 対多の関連付けの定義
#1対多の関連付けと1対1の関連付け 使い方はほぼ同じで、メソッド名が違うだけです。 1 対多のモデルで使用されるメソッド名は hasMany です。 hasMany と hasOne の使用方法やパラメータは基本的に同じです。 hasMany パラメータは次のとおりです:hasMany(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’]);
相信大家一看就知道下面这个是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 中国語 Web サイトの他の関連記事を参照してください。