먼저 테이블 간의 관계에 대해
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-debugbar3.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 '<br>'; });의 부팅 메소드에 다음 코드를 추가합니다. 실행된 SQL 문을 인쇄할 수도 있습니다. One-on-one
1. Userinfo 모델 객체를 생성합니다
cmd 명령줄을 입력하고 laravel 프로젝트가 있는 디렉터리를 입력합니다. 다음 명령을 실행합니다
php artisan make:model UserinfoUserinfo.php
2 Userinfo 모델 파일을 편집합니다
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Userinfo extends Model { protected $table = 'user_info'; protected $primaryKey = 'user_id'; protected $fillable = ['user_id','tel','email','addr']; public $timestamps = false; }3. UserModel을 작성하고 일대일 메소드를 추가합니다
<?php namespace App; use Illuminate\Database\Eloquent\Model; class UserModel extends Model { protected $table = 'user';//真是表名 protected $primaryKey = 'id';//主键字段,默认为id protected $fillable = ['name','password'];//可以操作的字段 public $timestamps = false;//如果数据表中没有created_at和updated_id字段,则$timestamps则可以不设置, 默认为true public function Userinfo() { /* * @param [string] [name] [需要关联的模型类名] * @param [string] [foreign] [参数一指定数据表中的字段] * */ return $this->hasOne('App\Userinfo','user_id'); }4. -to-one 방식
public function relation($mode) { switch ($mode){ case '1_1': { //一对一 $data = UserModel::find(1)->Userinfo()->get(); dd($data); } break; default; } }One-to-many
1. 기사 모델 객체 생성
Command 실행
php artisan make:model ArticleArticle.php 파일 생성
2. file
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Article extends Model { protected $table = 'article'; protected $primaryKey = 'id'; protected $fillable = ['id','title','content','user_id']; public $timestamps = false; }3. UserModel 작성 및 일대다 메소드 추가
public function Artice() { return $this->hasMany('App\Article','User_id'); }4, UserController 작성, 일대다 메소드 호출
public function relation($mode) { switch ($mode){ case '1_1': { //一对一 $data = UserModel::find(1)->Userinfo()->get(); dd($data); } break; case '1_n': { //一对多 $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 = 'country'; //真实表名 protected $primaryKey = "id"; //主键id protected $fillable = ['id','name']; //允许操作的字段 public $timestamps = false; //如果数据表中没有created_at和updated_id字段,则$timestamps则可以不设置, 默认为true }3, UserModel 작성, 다대일 메소드 추가
public function Country() { return $this->belongsTo('App\Country','country_id'); }4. method
public function relation($mode) { switch ($mode){ case '1_1': { //一对一 $data = UserModel::find(1)->Userinfo()->get(); dd($data); } break; case '1_n': { //一对多 $data = UserModel::find(1)->Artice()->get(); dd($data); } break; case 'n_1': { //多对一 $data = UserModel::find(1)->Country()->get(); dd($data); } break; default; } } }many-to-many
1. 역할 모델 객체 생성
execute command
php artisan make:model RoleExecute 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 = 'role'; protected $primaryKey = "id"; protected $fillable = ['name']; public $timestamps =false; }
3. UserModel을 작성하고 다대다 메소드를 추가합니다
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User_role extends Model { protected $table = 'user_role'; public $timestamps =false; }
4. 대다 방법
public function Role(){ /* * 第一个参数:要关联的表对应的类 * 第二个参数:中间表的表名 * 第三个参数:当前表跟中间表对应的外键 * 第四个参数:要关联的表跟中间表对应的外键 * */ return $this->belongsToMany('App\Role','user_role','user_id','role_id'); }
요약:
1. 일대일 사용법: hasOne()2 일대다 사용법: hasMany()
3. 방법: presentsTo()4. 다대다 사용 방법: presentsToMany()PHP 중국어 웹사이트, 다수의 무료laravel 입문 튜토리얼
, 온라인 학습을 환영합니다! 이 기사는 https://blog.csdn.net/weixin_38112233/article/details/79220535에서 복제되었습니다.
위 내용은 Laravel 입문 튜토리얼: 테이블 간의 관계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!