ホームページ > PHPフレームワーク > ThinkPHP > thinkphp 関連付けモデルの定義と使用の概要

thinkphp 関連付けモデルの定義と使用の概要

リリース: 2020-05-11 09:28:34
転載
2451 人が閲覧しました

thinkphp 関連付けモデルの定義と使用の概要

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 つの新しいファイルを作成し、対応するテーブルに従って名前を付けます。

thinkphp 関連付けモデルの定義と使用の概要

モデルの名前付け

モデルの名前付け規則モデル クラスはテーブルを削除します。プレフィックス付きのデータ テーブル名は、最初の文字が大文字のキャメル ケースで名前が付けられます。たとえば、上記の 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(&#39;AdminMessage&#39;,&#39;aid&#39;,&#39;id&#39;)->field(&#39;id,coltype,auth,name,intro,xuhao,pid,pname&#39;);
    }
}


?>
ログイン後にコピー

管理モデルが関連するメソッドを定義した後は、何も記述する必要はありません。 AdminMessage モデル内の対応するメソッドですが、少なくとも pwn_admin_message テーブルに対応する空のモデルが存在する必要があります。

同様に、このモデルで

<?php
namespace app\index\model;

use think\Model;
class AdminMessage extends Model{

}
?>
ログイン後にコピー

と記述する場合、関連するメソッドの命名規則はキャメルケースであるのに対し、関連する属性は通常小文字で下線が引かれていることに注意してください。 user_profile 関連属性を読み取る場合、対応する関連メソッドは us​​erProfile である必要があります。

コントローラー呼び出し

関連付けられたモデルをコントローラーで使用したい場合は、最初にモデル クラスを導入する必要があります。たとえば、関連付けられたメソッドを次のように定義しました。上記の管理モデル。コントローラーに管理モデルを導入する必要があります。

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=&#39;name&#39;)
    {
        //get 1 是获取id为 1 的数据
        //find() 是查找
        //toArray()  是获取到的数据转为数组
       $admin= Admin::get(1);
    var_dump($admin->find()->toArray());
    }
    ?>
ログイン後にコピー

次のブラウザにアクセスして結果を確認できます:

thinkphp 関連付けモデルの定義と使用の概要

結果がこのような場合、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=&#39;name&#39;)
    {
       $admin= Admin::get(1);
       //查询出pwn_admin_message 表aid为 1 的一条数据,然后转数组。
       $admin= $admin->AdminMessage->find()->toArray();  
        var_dump($admin);
        }
    }
  ?>
ログイン後にコピー

得られた結果は

thinkphp 関連付けモデルの定義と使用の概要

テストなので便宜上数値は使用せずテキストコードを使用しています直接的に行うと、より直観的かつ明確になります。

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=&#39;name&#39;)
    {
        $admin=Admin::hasWhere(&#39;AdminMessage&#39;,[&#39;email&#39;=>&#39;guanliB@ggg.com&#39;]);
        $admin=$admin->find()->toArray();
        var_dump($admin);
    }
   }
    ?>
ログイン後にコピー

出力結果:

thinkphp 関連付けモデルの定義と使用の概要


1 対多の関連付けの定義

#1対多の関連付けと1対1の関連付け 使い方はほぼ同じで、メソッド名が違うだけです。 1 対多のモデルで使用されるメソッド名は hasMany です。 hasMany と hasOne の使用方法やパラメータは基本的に同じです。

hasMany パラメータは次のとおりです:

hasMany(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’]);
ログイン後にコピー

上記 2 つのテーブルを例として取り上げますが、1 対多の関連付けを一致させるには、pwn_admin_message の内容と補助フィールドを一致させる必要があります。わずかに変更されます。複数の携帯電話番号と複数の電子メール アドレスを持つ管理者に変更します。

理解を容易にするために、2 つのテーブルのデータ内容のスクリーンショットを示します。

次の図は、pwn_admin_message テーブルの内容です:

thinkphp 関連付けモデルの定義と使用の概要

次の図は、pwn_admin テーブルの内容です:

thinkphp 関連付けモデルの定義と使用の概要

データを持っていない管理者もいますが、テストに十分であれば問題ありません。さて、さっそく本題に入りましょう。

相信大家一看就知道下面这个是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(&#39;AdminMessage&#39;,&#39;aid&#39;,&#39;id&#39;);
    }
}
ログイン後にコピー

而这下面这个是 AdminMessage 对应的是哪张表我就不说了。这和一对一关联一样也可以是个空模型

<?php
namespace app\index\model;
use think\Model;

class AdminMessage extends Model{
    /*    
    function Admin(){
      return $this->belongsTo(&#39;Admin&#39;,&#39;aid&#39;,&#39;id&#39;);
    }
    */
}
?>
ログイン後にコピー

控制器调用,这回就有点不一样了。因为返回的数据是一个二维数组里面包含了多个对象所以需要把数组循环出来并把对象在转为数组才能输出

<?php
namespace app\index\controller;
use think\Controller;
use app\index\model\Admin;

class index extends Controller
{
    /**
     * @param string $name
     */
    public function index($name=&#39;name&#39;)
    {
       $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());
        }
    }
}
?>
ログイン後にコピー

输出结果:

thinkphp 関連付けモデルの定義と使用の概要

还有两个函数也顺便说一下了,一个是 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=&#39;name&#39;)
    {
     //  $admin= Admin::get(1);
     $list= Admin::hasWhere(&#39;AdminMessage&#39;,[&#39;aid&#39;=>1])->select();
     $list1=Admin::has(&#39;AdminMessage&#39;,[&#39;aid&#39;=>2])->select();
    var_dump($list1[0]->toArray());
    }
   }

   ?>
ログイン後にコピー

这样子关联得出的结果是正常的:

thinkphp 関連付けモデルの定義と使用の概要

如果按 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=&#39;name&#39;)
    {
     //  $admin= Admin::get(1);
    // $list= Admin::hasWhere(&#39;AdminMessage&#39;,[&#39;aid&#39;=>1])->select();
     $list1=Admin::has(&#39;AdminMessage&#39;,[&#39;user&#39;=>&#39;jiehechen123&#39;])->select();
     var_dump($list1[0]->toArray());
    }
   }
  ?>
ログイン後にコピー

就会报出如下错误:

1thinkphp 関連付けモデルの定義と使用の概要

推荐教程:《TP5

以上がthinkphp 関連付けモデルの定義と使用の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート