> PHP 프레임워크 > Laravel > Laravel 입문 튜토리얼: 테이블 간의 관계

Laravel 입문 튜토리얼: 테이블 간의 관계

爱喝马黛茶的安东尼
풀어 주다: 2019-11-20 16:51:48
앞으로
2405명이 탐색했습니다.

Laravel 입문 튜토리얼: 테이블 간의 관계

먼저 테이블 간의 관계에 대해

1. 일대일

2. 일대다

3. 다대일

4. 다수 Many의 경우

부모 테이블과 자식 테이블을 구분합니다

1. "일" 쪽이 부모 테이블입니다.

2. "다" 쪽이 자식 테이블입니다.

하나를 처리하는 방법- 대다 관계

상위 테이블을 가리키도록 하위 테이블에 필드(외래 키)를 생성합니다.

다대다 관계를 처리하는 방법

중간 테이블을 생성하여 "다대다" 관계를 "일대다"

사례 분석

표 1: 사용자 테이블(it_user)

표 2: 사용자 세부 정보 테이블(it_user_info)

표 3: 기사 테이블(it_article)

표 4: 국가 테이블(it_country)

표 5: 사용자 역할 테이블(it_role)

1 일대일

사용자 테이블(표 1) 및 세부 정보 테이블(표 2) )는 일대일 관계입니다

②일대다

사용자 테이블(표 1)은 기사 테이블(표 3)과 일대다 관계가 있습니다

③다대일

사용자 테이블(표 1)과 국가 테이블(표 4)은 다대일 관계입니다

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에 대한 debugbar를 로드하고, 'providers' 배열에 다음 구성을 추가합니다:

Barryvdh\Debugbar\ServiceProvider::class,
로그인 후 복사

설치 외에도 debugbar 디버깅 도구 외에도 쿼리를 사용할 수도 있습니다. 모니터링: 공급자/AppServiceProvider.php

\DB::listen(function ($query) {
    var_dump($query->sql);
     var_dump($query->bindings);
     echo &#39;<br>&#39;;
 });
로그인 후 복사

의 부팅 메소드에 다음 코드를 추가합니다. 실행된 SQL 문을 인쇄할 수도 있습니다.

One-on-one

1. Userinfo 모델 객체를 생성합니다

cmd 명령줄을 입력하고 laravel 프로젝트가 있는 디렉터리를 입력합니다. 다음 명령을 실행합니다

php artisan make:model Userinfo
로그인 후 복사

Userinfo.php

2 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을 작성하고 일대일 메소드를 추가합니다

<?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. -to-one 방식

    public function relation($mode)
    {
        switch ($mode){
            case &#39;1_1&#39;:
            {
                //一对一
                $data = UserModel::find(1)->Userinfo()->get();
                dd($data);
            }
            break;
            default;
        }
    }
로그인 후 복사

One-to-many

1. 기사 모델 객체 생성

Command 실행

php artisan make:model Article
로그인 후 복사

Article.php 파일 생성

2. file

<?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 작성 및 일대다 메소드 추가

public function Artice()
    {
        return $this->hasMany(&#39;App\Article&#39;,&#39;User_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;
            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 작성, 다대일 메소드 추가

public function Country()
{
    return $this->belongsTo(&#39;App\Country&#39;,&#39;country_id&#39;);
}
로그인 후 복사
4. method

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;
        }
    }
}
로그인 후 복사

many-to-many

1. 역할 모델 객체 생성

execute command

php artisan make:model Role
로그인 후 복사

Execute Command

php artisan make:model User_role
로그인 후 복사

2.

User_role 작성 model

테이블에 기본 키 필드가 없으므로 두 개의 필드가 필요합니다

<?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;
}
로그인 후 복사

3. UserModel을 작성하고 다대다 메소드를 추가합니다

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User_role extends Model
{
    protected $table = &#39;user_role&#39;;
    public $timestamps  =false;
}
로그인 후 복사

4. 대다 방법

    public function Role(){
        /*
         * 第一个参数:要关联的表对应的类
         * 第二个参数:中间表的表名
         * 第三个参数:当前表跟中间表对应的外键
         * 第四个参数:要关联的表跟中间表对应的外键
         * */
        return $this->belongsToMany(&#39;App\Role&#39;,&#39;user_role&#39;,&#39;user_id&#39;,&#39;role_id&#39;);
    }
로그인 후 복사

요약:

1. 일대일 사용법: hasOne()

2 일대다 사용법: hasMany()

3. 방법: presentsTo()

4. 다대다 사용 방법: presentsToMany()

PHP 중국어 웹사이트, 다수의 무료

laravel 입문 튜토리얼

, 온라인 학습을 환영합니다!

이 기사는 https://blog.csdn.net/weixin_38112233/article/details/79220535

에서 복제되었습니다.

위 내용은 Laravel 입문 튜토리얼: 테이블 간의 관계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿