这是转载的文章

出处:https://blog.csdn.net/weixin_38112233/article/details/79220535

作者:重新遇到

一。建表和插入测试数据

1.用户表建表及测试数据

  1. DROP TABLE IF EXISTS `it_user`;
  2. CREATE TABLE `it_user` (
  3. `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  4. `name` varchar(64) DEFAULT NULL COMMENT '用户名',
  5. `password` char(32) DEFAULT NULL COMMENT '密码(不使用md5)',
  6. `country_id` int(11) DEFAULT NULL,
  7. PRIMARY KEY (`id`),
  8. KEY `国家id` (`country_id`)
  9. ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

插入测试数据

  1. INSERT INTO `it_user` VALUES ('', 'xiaoming', '', '');
  2. INSERT INTO `it_user` VALUES ('', 'xiaomei', '', '');
  3. INSERT INTO `it_user` VALUES ('', 'xiaoli-new', '', '');

2.用户详情表建表及测试数据

  1. DROP TABLE IF EXISTS `it_user_info`;
  2. CREATE TABLE `it_user_info` (
  3. `user_id` int(11) NOT NULL AUTO_INCREMENT,
  4. `tel` char(11) DEFAULT NULL,
  5. `email` varchar(128) DEFAULT NULL,
  6. `addr` varchar(255) DEFAULT NULL,
  7. PRIMARY KEY (`user_id`)
  8. ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
  1. 插入测试数据

  1. INSERT INTO `it_user_info` VALUES ('', '', 'xiaoming@163.com', '北京');
  2. INSERT INTO `it_user_info` VALUES ('', '', 'xiaomei@163.com', '上海');
  3. INSERT INTO `it_user_info` VALUES ('', '', 'xiaoli@163.com', '武汉');

3文章表建表及测试数据

  1. DROP TABLE IF EXISTS `it_article`;
  2. CREATE TABLE `it_article` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `title` varchar(255) DEFAULT NULL,
  5. `content` text,
  6. `user_id` int(11) DEFAULT NULL,
  7. PRIMARY KEY (`id`),
  8. KEY `user_id` (`user_id`)
  9. ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

插入测试数据

  1. INSERT INTO `it_article` VALUES ('', '世界那么大,我想去看看', '钱包那么小,总是不够', '');
  2. INSERT INTO `it_article` VALUES ('', '我想撞角遇到爱', '却是碰到鬼', '');
  3. INSERT INTO `it_article` VALUES ('', '哈哈哈哈', '嘻嘻嘻嘻', '');

4.国家表建表及测试数据

  1. DROP TABLE IF EXISTS `it_country`;
  2. CREATE TABLE `it_country` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `name` varchar(255) DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

插入测试数据

  1. INSERT INTO `it_country` VALUES ('', '中国');
  2. INSERT INTO `it_country` VALUES ('', '美国');

5.用户角色表建表及测试数据

  1. DROP TABLE IF EXISTS `it_role`;
  2. CREATE TABLE `it_role` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `name` varchar(255) DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

插入测试数据

  1. INSERT INTO `it_role` VALUES ('', '开发');
  2. INSERT INTO `it_role` VALUES ('', '测试');
  3. INSERT INTO `it_role` VALUES ('', '管理');
  1.  

6.用户和角色中间表表建表及测试数据

  1. DROP TABLE IF EXISTS `it_user_role`;
  2. CREATE TABLE `it_user_role` (
  3. `user_id` int(11) DEFAULT NULL,
  4. `role_id` int(11) DEFAULT NULL,
  5. KEY `role_id` (`role_id`),
  6. KEY `user_id` (`user_id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

插入测试数据

  1. INSERT INTO `it_user_role` VALUES ('', '');
  2. INSERT INTO `it_user_role` VALUES ('', '');
  3. INSERT INTO `it_user_role` VALUES ('', '');
  4. INSERT INTO `it_user_role` VALUES ('', '');
  5. INSERT INTO `it_user_role` VALUES ('', '');
  1. 二设置表前缀
    打开config/database.php
    'prefix' => env('DB_PREFIX', ''),
     然后在.env文件中加入DB_PREFIX=it_

执行命令

php artisan make:controller ORM\UserController

  1. <?php
  2.  
  3. namespace App\Http\Controllers\ORM;
  4.  
  5. use Illuminate\Http\Request;
  6. use App\Http\Controllers\Controller;
  7.  
  8. class UserController extends Controller
  9. {
  10. public function relation($mode)
  11. {
  12. switch ($mode){
  13. case '1_1':
  14. {
  15. //一对一
  16.  
  17. }
  18. break;
  19. case '1_n':
  20. {
  21. //一对多
  22.  
  23. }
  24. break;
  25. case 'n_1':
  26. {
  27. //多对一
  28.  
  29. }
  30. break;
  31. case 'n_n':
  32. {
  33. //多对多
  34.  
  35. }
  36. break;
  37. default;
  38. }
  39.  
  40. }
  41.  
  42. }

php artisan make:model UserModel
Model created successfully.

  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use Illuminate\Database\Eloquent\Model;
  6.  
  7. class UserModel extends Model
  8. {
  9. protected $table = 'user';//真是表名
  10. protected $primaryKey = 'id';//主键字段,默认为id
  11. protected $fillable = ['name','password'];//可以操作的字段
  12. public $timestamps = false;//如果数据表中没有created_at和updated_id字段,则$timestamps则可以不设置,默认为true
  13.  
  14. public function Userinfo()
  15. {
  16. /*
  17. * @param [string] [name] [需要关联的模型类名]
  18. * @param [string] [foreign] [参数一指定数据表中的字段]
  19. * */
  20. return $this->hasOne('App\Userinfo','user_id');
  21. }
  22.  
  23. }

php artisan make:model Userinfo
Model created successfully.

  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use Illuminate\Database\Eloquent\Model;
  6.  
  7. class Userinfo extends Model
  8. {
  9. protected $table = 'user_info';
  10. protected $primaryKey = 'user_id';
  11. protected $fillable = ['user_id','tel','email','addr'];
  12. public $timestamps = false;
  13. }

添加路由

Route::get('/orm/relation/{mode}','ORM\UserController@relation');

三。编写UserController, 调用一对一方法

  1. <?php
  2.  
  3. namespace App\Http\Controllers\ORM;
  4.  
  5. use App\UserModel;
  6. use Illuminate\Http\Request;
  7. use App\Http\Controllers\Controller;
  8.  
  9. class UserController extends Controller
  10. {
  11. public function relation($mode)
  12. {
  13. switch ($mode){
  14. case '1_1':
  15. {
  16. //一对一
  17. $data = UserModel::find(1)->Userinfo()->get();
  18. dd($data);
  19. }
  20. break;
  21. case '1_n':
  22. {
  23. //一对多
  24.  
  25. }
  26. break;
  27. case 'n_1':
  28. {
  29. //多对一
  30.  
  31. }
  32. break;
  33. case 'n_n':
  34. {
  35. //多对多
  36.  
  37. }
  38. break;
  39. default;
  40. }
  41.  
  42. }
  43.  
  44. }

http://127.0.0.1/fun/public/orm/relation/1_1

php artisan make:model Article
Model created successfully.

编写Article模型

  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use Illuminate\Database\Eloquent\Model;
  6.  
  7. class Article extends Model
  8. {
  9. protected $table = 'article';
  10. protected $primaryKey = 'id';
  11. protected $fillable = ['id','title','content','user_id'];
  12. public $timestamps = false;
  13.  
  14. }

编写UserModel, 加入一对多方法

  1. public function Artice()
  2. {
  3. return $this->hasMany('App\Article','User_id');
  4. }

编写UserController,调用一对多方法

  1. case '1_n':
  2. {
  3. //一对多
  4. $data = UserModel::find(1)->Artice()->get();
  5. dd($data);
  6.  
  7. }
  8. break;

http://127.0.0.1/fun/public/orm/relation/1_n

php artisan make:model Country
Model created successfully.

、编写country模型文件

  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use Illuminate\Database\Eloquent\Model;
  6.  
  7. class Country extends Model
  8. {
  9.  
  10. protected $table = 'country'; //真实表名
  11. protected $primaryKey = "id"; //主键id
  12. protected $fillable = ['id','name']; //允许操作的字段
  13. public $timestamps =false; //如果数据表中没有created_at和updated_id字段,则$timestamps则可以不设置,默认为true
  14.  
  15. }

编写UserModel, 加入多对一方法

  1. public function Country()
  2. {
  3. return $this->belongsTo('App\Country','country_id');
  4. }

编写UserController, 调用方法

  1. case 'n_1':
  2. {
  3. //多对一
  4. //多对一
  5. $data = UserModel::find(1)->Country()->get();
  6. dd($data);
  7.  
  8. }
  9. break;

http://127.0.0.1/fun/public/orm/relation/n_1

1、创建role模型对象

执行命令 
php artisan make:model Role 
执行命令 
php artisan make:model User_role

2、编写Role模型

  1. namespace App;
  2.  
  3. use Illuminate\Database\Eloquent\Model;
  4.  
  5. class Role extends Model
  6. {
  7. protected $table = 'role';
  8. protected $primaryKey = "id";
  9. protected $fillable = ['name'];
  10. public $timestamps =false;
  11. }

编写User_role模型

因为表中没有主键字段,所以需要两个字段即可

  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use Illuminate\Database\Eloquent\Model;
  6.  
  7. class User_role extends Model
  8. {
  9. protected $table = 'user_role';
  10. public $timestamps =false;
  11.  
  12. }

3、编写UserModel, 加入多对多方法

  1. public function Role(){
  2. /*
  3. * 第一个参数:要关联的表对应的类
  4. * 第二个参数:中间表的表名
  5. * 第三个参数:当前表跟中间表对应的外键
  6. * 第四个参数:要关联的表跟中间表对应的外键
  7. * */
  8. return $this->belongsToMany('App\Role','user_role','user_id','role_id');
  9. }

4、编写UserController, 调用多对多方法

  1. case 'n_n':
  2. {
  3. //多对多
  4. $data = UserModel::find(2)->Role()->get();
  5. dd($data);
  6.  
  7. }
  8. break;

http://127.0.0.1/fun/public/orm/relation/n_n

[转载]关于laravel中表关系的一对一、一对多、多对一、多对多实践的更多相关文章

  1. 【个人笔记】《知了堂》MySQL三种关系:一对一,一对多,多对多。

    一对一:比如一个学生对应一个身份证号.学生档案: 一对多:一个班可以有很多学生,但是一个学生只能在一个班: 多对多:一个班可以有很多学生,学生也可以有很多课程: 一对多关系处理: 我们以学生和班级之间 ...

  2. JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明

    JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...

  3. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  4. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  5. JPA总结——实体关系映射(一对多@OneToMany)

    JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...

  6. hibernate对象关系实现(一)一对多

    hibernate是对jdk一个封装工具,实现对象和数据库之间数据映射.使用时涉及到四个问题:a.对象之间的关系在类中的体现:b,对象关系对应的数据库中表之间体现:c.实现a,b在hibernate的 ...

  7. 初学者易上手的SSH-hibernate04 一对一 一对多 多对多

    这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...

  8. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

  9. Mybatis学习第四天——一对一&&一对多

    两表关系: 1.Mybatis中一对一关系 <!-- 两表联查,通过相同属性user_id left join 表示以左边的表为主表 --> <select id="fin ...

随机推荐

  1. ejs常用功能函数

    利用<%- include filename %>加载其他页面模版: 1.缓存功能,能够缓存已经解析好的html模版: 2.<% code %>用于执行其中javascript ...

  2. linux命令行安装teamviewer

    teamviewer最新版本为14,但是Ubuntu14.04不支持,安装13版本即可. sudo dpkg -i teamviewer_13.2.26559_amd64.deb若报错,即缺少依赖,运 ...

  3. 【HNOI 2018】毒瘤

    Problem Description 从前有一名毒瘤. 毒瘤最近发现了量产毒瘤题的奥秘.考虑如下类型的数据结构题:给出一个数组,要求支持若干种奇奇怪怪的修改操作(例如给一个区间内的数同时加上 \(c ...

  4. JavaScript 的 this 原理

    一.问题的由来 学懂 JavaScript 语言,一个标志就是理解下面两种写法,可能有不一样的结果. var obj = { foo: function () {} }; var foo = obj. ...

  5. Unity日常记录 - QualitySettings 性能设置

    unity打包时,可通过QualitySettings优化图像性能,这是最常设置也是最明显的图像性能体现 设置图形质量的水平,一般来说,质量是以牺牲性能为代价的,所以最好不要追求移动设备或旧硬件的最高 ...

  6. python-*args和**kwargs作用和区别

    1. *args 不定长的参数:*args 无论你传递一个参数还是二个还是多个都可以.(*args传入的是无命名参数,例如:add(1,2,3,4,5)存储的是元祖)args可以自定义其他名称 def ...

  7. Jieba库使用和好玩的词云

    jieba库的使用: (1)  jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式.全模式和搜索引擎模式,下面是三种模式的特点. 精确模式:试图将语句最精 ...

  8. jieba库的使用和好玩的词云

    1.jieba库基本介绍 (1).jieba库概述 jieba是优秀的中文分词第三方库 - 中文文本需要通过分词获得单个的词语         - jieba是优秀的中文分词第三方库,需要额外安装 - ...

  9. Flex4之皮肤定制

    Flex4之皮肤定制[Skin类和Skin类]          博客分类: RIA-Flex4专栏 FlexAdobeUPFlashUI 第一.关于spark.skin.SparkSkin类的 1. ...

  10. Log4Net 常见格式说明(不断更新中)

    用户名  %username pc版本 另起一行 %newline