ホームページ > 記事 > PHPフレームワーク > thinkphp5 での関連付けモデルの定義と使用
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('関連モデル名', '外部キー名','主キー名',['モデルエイリアス定義'],'結合タイプ');
デフォルトの結合タイプは INNERです
モデル定義
Admin モデルは 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'); } } ?>
Admin モデルが関連メソッドを定義した後は、AdminMessage モデルに対応するメソッドを記述する必要はありませんが、 pwn_admin_message テーブルに対応する少なくとも 1 つの空のモデル。
同様に、このモデルで
<?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); } } ?>
出力結果:
1 対多の関連付けの定義
1 対多の関連付けと 1 対1 つの関連付けはほぼ同じですが、違いはメソッド名が異なることです。 1 対多のモデルで使用されるメソッド名は hasMany です。 hasMany と hasOne の使用方法やパラメータは基本的に同じです。
hasMany パラメータは次のとおりです:
hasMany('関連モデル名', '外部キー名', '主キー名', ['モデル エイリアス定義']);
上記の 2 つのテーブルを例として取り上げますが、1 対多の関連付けに一致させるには、pwn_admin_message と aid フィールドの内容をわずかに変更する必要があります。複数の携帯電話番号と複数の電子メール アドレスを持つ管理者に変更します。
理解を容易にするために、2 つのテーブルのデータ内容のスクリーンショットを示します。
次の図は、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 中国語 Web サイトの他の関連記事を参照してください。