Laravel 入門チュートリアル: テーブル間の関係

爱喝马黛茶的安东尼
リリース: 2019-11-20 16:51:48
転載
2399 人が閲覧しました

Laravel 入門チュートリアル: テーブル間の関係

まずはテーブル間の関係について

1.1 対 1

2.1 対多

3.多対 1

4.多対多

親テーブルと子テーブルを区別する

1.「一方」の側が親テーブルです

2. 「多」側 これは子テーブルです

1 対多の関係を扱う方法

Create親テーブルを指す子テーブルのフィールド (外部キー)

多対多のリレーションシップを扱う方法

「多対多」の関係を「1 対多」に変換するための中間テーブルを作成します

ケース分析

テーブル1: ユーザー テーブル (it_user)

表 2: ユーザー詳細テーブル (it_user_info)

表 3: 記事テーブル (it_article)

表 4: 国テーブル (it_country)

表 5: ユーザー ロール テーブル (it_role)

① 1 対 1

ユーザー テーブル (表 1) と詳細テーブル (表 2) には、 1 対 1 の関係

#②1 対多

#user テーブル (表 1) と記事テーブル (表 3) は 1 対多の関係です

③多対一

ユーザーテーブル(表1)と国テーブル(表4)は多対一の関係です

④多対多

ユーザー テーブル (表 1) とロール テーブル (表 5) は多対多の関係です

ユーザー テーブルの作成とテスト データ

DROP TABLE IF EXISTS `it_user`;
CREATE TABLE `it_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(64) DEFAULT NULL COMMENT '用户名',
  `password` char(32) DEFAULT NULL COMMENT '密码(不使用md5)',
  `country_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `国家id` (`country_id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_user
-- ----------------------------
INSERT INTO `it_user` VALUES ('1', 'xiaoming', '123456', '1');
INSERT INTO `it_user` VALUES ('2', 'xiaomei', '123456', '1');
INSERT INTO `it_user` VALUES ('3', 'xiaoli-new', '123', '1');
ログイン後にコピー
ユーザー詳細テーブルの作成とテスト データ

-- ----------------------------
-- Table structure for it_user_info
-- ----------------------------
DROP TABLE IF EXISTS `it_user_info`;
CREATE TABLE `it_user_info` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `tel` char(11) DEFAULT NULL,
  `email` varchar(128) DEFAULT NULL,
  `addr` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_user_info
-- ----------------------------
INSERT INTO `it_user_info` VALUES ('1', '13012345678', 'xiaoming@163.com', '北京');
INSERT INTO `it_user_info` VALUES ('2', '15923456789', 'xiaomei@163.com', '上海');
INSERT INTO `it_user_info` VALUES ('3', '18973245670', 'xiaoli@163.com', '武汉');
ログイン後にコピー
記事テーブルの作成とテスト データ

-- ----------------------------
-- Table structure for it_article
-- ----------------------------
DROP TABLE IF EXISTS `it_article`;
CREATE TABLE `it_article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `content` text,
  `user_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_article
-- ----------------------------
INSERT INTO `it_article` VALUES ('1', '世界那么大,我想去看看', '钱包那么小,总是不够', '1');
INSERT INTO `it_article` VALUES ('2', '我想撞角遇到爱', '却是碰到鬼', '2');
INSERT INTO `it_article` VALUES ('3', '哈哈哈哈', '嘻嘻嘻嘻', '1');
ログイン後にコピー
国テーブルの作成とテスト データ

-- ----------------------------
-- Table structure for it_country
-- ----------------------------
DROP TABLE IF EXISTS `it_country`;
CREATE TABLE `it_country` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_country
-- ----------------------------
INSERT INTO `it_country` VALUES ('1', '中国');
INSERT INTO `it_country` VALUES ('2', '美国');
ログイン後にコピー
ユーザー ロール テーブルの作成とテスト データ

-- ----------------------------
-- Table structure for it_role
-- ----------------------------
DROP TABLE IF EXISTS `it_role`;
CREATE TABLE `it_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_role
-- ----------------------------
INSERT INTO `it_role` VALUES ('1', '开发');
INSERT INTO `it_role` VALUES ('2', '测试');
INSERT INTO `it_role` VALUES ('3', '管理');
ログイン後にコピー
ユーザーとロールの中間テーブルの作成とテスト データ

-- ----------------------------
-- Table structure for it_user_role
-- ----------------------------
DROP TABLE IF EXISTS `it_user_role`;
CREATE TABLE `it_user_role` (
  `user_id` int(11) DEFAULT NULL,
  `role_id` int(11) DEFAULT NULL,
  KEY `role_id` (`role_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_user_role
-- ----------------------------
INSERT INTO `it_user_role` VALUES ('1', '1');
INSERT INTO `it_user_role` VALUES ('1', '2');
INSERT INTO `it_user_role` VALUES ('1', '3');
INSERT INTO `it_user_role` VALUES ('2', '1');
INSERT INTO `it_user_role` VALUES ('3', '2');
ログイン後にコピー

準備作業

1. ルーティングの計画

routes/ web.php の下に次のルートを記述します。 ##

//ORM的关联关系
Route::get('/orm/relation/{mode}','ORM\UserController@relation');
ログイン後にコピー

2. App/Http/Controllers/ORM/UserController.php

    public function relation($mode)
    {
        switch ($mode){
            case '1_1':
            {
                //一对一
            }
            break;
            case '1_n':
            {
                //一对多
            }
                break;
            case 'n_1':
            {
                //多对一
            }
                break;
            case 'n_n':
            {
                //多对多
            }
                break;
            default;
        }
    }
ログイン後にコピー

3. デバッグ デバッグ ツールをインストールします

3.1コンポーザーコマンドを使用して

composer require  barryvdh/laravel-debugbar
ログイン後にコピー
をインストールします3.2.config/app.phpファイルを変更し、laravelにデバッグバーをプロジェクトにロードし、それを'providers'配列に追加します。構成:

Barryvdh\Debugbar\ServiceProvider::class,
ログイン後にコピー

debugbar デバッグ ツールのインストールに加えて、クエリ監視を使用することもできます。 Providers/AppServiceProvider.php のブート メソッドに次のコードを追加します。

\DB::listen(function ($query) {
    var_dump($query->sql);
     var_dump($query->bindings);
     echo &#39;<br>&#39;;
 });
ログイン後にコピー

印刷することもできます。実行された SQL ステートメントを出力します。

1 対 1

1. Userinfo モデル オブジェクトを作成します

cmd コマンドライン。laravel プロジェクトが配置されているディレクトリ

php artisan make:model Userinfo
ログイン後にコピー
で次のコマンドを実行すると、App ディレクトリ

2 に Userinfo.php が生成されます。Userinfo モデル ファイルを編集します

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Userinfo extends Model
{
    protected $table  =  &#39;user_info&#39;;
    protected $primaryKey = &#39;user_id&#39;;
    protected $fillable = [&#39;user_id&#39;,&#39;tel&#39;,&#39;email&#39;,&#39;addr&#39;];
    public    $timestamps = false;
}
ログイン後にコピー

3. UserModel を作成し、1 対 1 のメソッドを追加します。 ##

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class UserModel extends Model
{
    protected $table = &#39;user&#39;;//真是表名
    protected $primaryKey = &#39;id&#39;;//主键字段,默认为id
    protected $fillable = [&#39;name&#39;,&#39;password&#39;];//可以操作的字段
    public $timestamps = false;//如果数据表中没有created_at和updated_id字段,则$timestamps则可以不设置,
    默认为true
    public function Userinfo()
    {
        /*
         * @param [string] [name] [需要关联的模型类名]
         * @param [string] [foreign] [参数一指定数据表中的字段]
         * */
        return $this->hasOne(&#39;App\Userinfo&#39;,&#39;user_id&#39;);
    }
ログイン後にコピー

##4. UserController を作成し、1 対 1 のメソッドを呼び出します

    public function relation($mode)
    {
        switch ($mode){
            case &#39;1_1&#39;:
            {
                //一对一
                $data = UserModel::find(1)->Userinfo()->get();
                dd($data);
            }
            break;
            default;
        }
    }
ログイン後にコピー

# 1 対多

##1. 記事モデル オブジェクトを作成します

#コマンドを実行します

php artisan make:model Article
ログイン後にコピー
アプリの下にArticle.phpファイルを生成します

2.記事モデルファイル

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
    protected $table = &#39;article&#39;;
    protected $primaryKey = &#39;id&#39;;
    protected $fillable = [&#39;id&#39;,&#39;title&#39;,&#39;content&#39;,&#39;user_id&#39;];
    public $timestamps  = false;
}
ログイン後にコピー

3を作成します。 UserModel を作成し、1 対多のメソッドを追加します。

public function Artice()
    {
        return $this->hasMany(&#39;App\Article&#39;,&#39;User_id&#39;);
    }
ログイン後にコピー

4. UserController を作成し、1 対多のメソッドを呼び出します。

    public function relation($mode)
    {
        switch ($mode){
            case &#39;1_1&#39;:
            {
                //一对一
                $data = UserModel::find(1)->Userinfo()->get();
                dd($data);
            }
            break;
            case &#39;1_n&#39;:
            {
                //一对多
                $data = UserModel::find(1)->Artice()->get();
                dd($data);
            }
                break;
            default;
        }
    }
}
ログイン後にコピー

#多対一

#1. 国モデル オブジェクトの作成

はコマンド

php artisan make:model Country
ログイン後にコピー
2 を実行します国モデル ファイルを作成します
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Country extends Model
{
    protected $table = &#39;country&#39;;   //真实表名
    protected $primaryKey = "id";   //主键id
    protected $fillable = [&#39;id&#39;,&#39;name&#39;];    //允许操作的字段
    public $timestamps = false; //如果数据表中没有created_at和updated_id字段,则$timestamps则可以不设置,
    默认为true
}
ログイン後にコピー

3. UserModel を作成し、多対 1 メソッドを追加します

public function Country()
{
    return $this->belongsTo(&#39;App\Country&#39;,&#39;country_id&#39;);
}
ログイン後にコピー

4. UserController を作成し、メソッド

public function relation($mode)
    {
        switch ($mode){
            case &#39;1_1&#39;:
            {
                //一对一
                $data = UserModel::find(1)->Userinfo()->get();
                dd($data);
            }
            break;
            case &#39;1_n&#39;:
            {
                //一对多
                $data = UserModel::find(1)->Artice()->get();
                dd($data);
            }
                break;
            case &#39;n_1&#39;:
            {
                //多对一
                $data = UserModel::find(1)->Country()->get();
                dd($data);
            }
                break;
            default;
        }
    }
}
ログイン後にコピー

多対多

1. ロール モデル オブジェクトの作成

コマンドの実行

php artisan make:model Role
ログイン後にコピー
コマンドの実行
php artisan make:model User_role
ログイン後にコピー
2.ロール モデルの書き込み

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
    protected $table = &#39;role&#39;;
    protected $primaryKey = "id";
    protected $fillable = [&#39;name&#39;];
    public $timestamps  =false;
}
ログイン後にコピー
User_role モデルの書き込み

理由テーブルには主キー フィールドがありません。2 つのフィールドが必要です。

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User_role extends Model
{
    protected $table = &#39;user_role&#39;;
    public $timestamps  =false;
}
ログイン後にコピー

##3. UserModel を作成し、多対多メソッドを追加します

    public function Role(){
        /*
         * 第一个参数:要关联的表对应的类
         * 第二个参数:中间表的表名
         * 第三个参数:当前表跟中间表对应的外键
         * 第四个参数:要关联的表跟中间表对应的外键
         * */
        return $this->belongsToMany(&#39;App\Role&#39;,&#39;user_role&#39;,&#39;user_id&#39;,&#39;role_id&#39;);
    }
ログイン後にコピー

4. UserController を記述し、多対多メソッドを呼び出す

public function relation($mode)
{
    switch ($mode){
        case &#39;1_1&#39;:
        {
            //一对一
            $data = UserModel::find(1)->Userinfo()->get();
            dd($data);
        }
        break;
        case &#39;1_n&#39;:
        {
            //一对多
            $data = UserModel::find(1)->Artice()->get();
            dd($data);
        }
            break;
        case &#39;n_1&#39;:
        {
            //多对一
            $data = UserModel::find(1)->Country()->get();
            dd($data);
        }
            break;
        case &#39;n_n&#39;:
        {
            //多对多
           $data = UserModel::find(2)->Role()->get();
           dd($data);
        }
            break;
        default;
    }
}
ログイン後にコピー

概要:

1. 1 ペア 1 つの使用メソッド: hasOne()2. 1 対多の使用方法: hasMany()

3. 多対 1 の使用方法:belongsTo()4. Many many の使用方法:belongsToMany()

PHP 中国語 Web サイト、多数の無料 laravel 入門チュートリアル、オンライン学習へようこそ!

この記事は、https://blog.csdn.net/weixin_38112233/article/details/79220535

から転載されました。

以上がLaravel 入門チュートリアル: テーブル間の関係の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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