[转载]关于laravel中表关系的一对一、一对多、多对一、多对多实践
这是转载的文章
出处:https://blog.csdn.net/weixin_38112233/article/details/79220535
作者:重新遇到
一。建表和插入测试数据
1.用户表建表及测试数据
- 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;
插入测试数据
- INSERT INTO `it_user` VALUES ('', 'xiaoming', '', '');
- INSERT INTO `it_user` VALUES ('', 'xiaomei', '', '');
- INSERT INTO `it_user` VALUES ('', 'xiaoli-new', '', '');
2.用户详情表建表及测试数据
- 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;
- 插入测试数据
- INSERT INTO `it_user_info` VALUES ('', '', 'xiaoming@163.com', '北京');
- INSERT INTO `it_user_info` VALUES ('', '', 'xiaomei@163.com', '上海');
- INSERT INTO `it_user_info` VALUES ('', '', 'xiaoli@163.com', '武汉');
3文章表建表及测试数据
- 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;
插入测试数据
- INSERT INTO `it_article` VALUES ('', '世界那么大,我想去看看', '钱包那么小,总是不够', '');
- INSERT INTO `it_article` VALUES ('', '我想撞角遇到爱', '却是碰到鬼', '');
- INSERT INTO `it_article` VALUES ('', '哈哈哈哈', '嘻嘻嘻嘻', '');
4.国家表建表及测试数据
- 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;
插入测试数据
- INSERT INTO `it_country` VALUES ('', '中国');
- INSERT INTO `it_country` VALUES ('', '美国');
5.用户角色表建表及测试数据
- 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;
插入测试数据
- INSERT INTO `it_role` VALUES ('', '开发');
- INSERT INTO `it_role` VALUES ('', '测试');
- INSERT INTO `it_role` VALUES ('', '管理');
6.用户和角色中间表表建表及测试数据
- 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;
插入测试数据
- INSERT INTO `it_user_role` VALUES ('', '');
- INSERT INTO `it_user_role` VALUES ('', '');
- INSERT INTO `it_user_role` VALUES ('', '');
- INSERT INTO `it_user_role` VALUES ('', '');
- INSERT INTO `it_user_role` VALUES ('', '');
- 二设置表前缀
打开config/database.php
'prefix' => env('DB_PREFIX', ''),
然后在.env文件中加入DB_PREFIX=it_
执行命令
php artisan make:controller ORM\UserController
- <?php
- namespace App\Http\Controllers\ORM;
- use Illuminate\Http\Request;
- use App\Http\Controllers\Controller;
- class UserController extends Controller
- {
- public function relation($mode)
- {
- switch ($mode){
- case '1_1':
- {
- //一对一
- }
- break;
- case '1_n':
- {
- //一对多
- }
- break;
- case 'n_1':
- {
- //多对一
- }
- break;
- case 'n_n':
- {
- //多对多
- }
- break;
- default;
- }
- }
- }
php artisan make:model UserModel
Model created successfully.
- <?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');
- }
- }
php artisan make:model Userinfo
Model created successfully.
- <?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;
- }
添加路由
Route::get('/orm/relation/{mode}','ORM\UserController@relation');
三。编写UserController, 调用一对一方法
- <?php
- namespace App\Http\Controllers\ORM;
- use App\UserModel;
- use Illuminate\Http\Request;
- use App\Http\Controllers\Controller;
- class UserController extends Controller
- {
- public function relation($mode)
- {
- switch ($mode){
- case '1_1':
- {
- //一对一
- $data = UserModel::find(1)->Userinfo()->get();
- dd($data);
- }
- break;
- case '1_n':
- {
- //一对多
- }
- break;
- case 'n_1':
- {
- //多对一
- }
- break;
- case 'n_n':
- {
- //多对多
- }
- break;
- default;
- }
- }
- }
http://127.0.0.1/fun/public/orm/relation/1_1
php artisan make:model Article
Model created successfully.
编写Article模型
- <?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;
- }
编写UserModel, 加入一对多方法
- public function Artice()
- {
- return $this->hasMany('App\Article','User_id');
- }
编写UserController,调用一对多方法
- case '1_n':
- {
- //一对多
- $data = UserModel::find(1)->Artice()->get();
- dd($data);
- }
- break;
http://127.0.0.1/fun/public/orm/relation/1_n
php artisan make:model Country
Model created successfully.
、编写country模型文件
- <?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
- }
编写UserModel, 加入多对一方法
- public function Country()
- {
- return $this->belongsTo('App\Country','country_id');
- }
编写UserController, 调用方法
- case 'n_1':
- {
- //多对一
- //多对一
- $data = UserModel::find(1)->Country()->get();
- dd($data);
- }
- 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模型
- namespace App;
- use Illuminate\Database\Eloquent\Model;
- class Role extends Model
- {
- protected $table = 'role';
- protected $primaryKey = "id";
- protected $fillable = ['name'];
- public $timestamps =false;
- }
编写User_role模型
因为表中没有主键字段,所以需要两个字段即可
- <?php
- namespace App;
- use Illuminate\Database\Eloquent\Model;
- class User_role extends Model
- {
- protected $table = 'user_role';
- public $timestamps =false;
- }
3、编写UserModel, 加入多对多方法
- public function Role(){
- /*
- * 第一个参数:要关联的表对应的类
- * 第二个参数:中间表的表名
- * 第三个参数:当前表跟中间表对应的外键
- * 第四个参数:要关联的表跟中间表对应的外键
- * */
- return $this->belongsToMany('App\Role','user_role','user_id','role_id');
- }
4、编写UserController, 调用多对多方法
- case 'n_n':
- {
- //多对多
- $data = UserModel::find(2)->Role()->get();
- dd($data);
- }
- break;
http://127.0.0.1/fun/public/orm/relation/n_n
[转载]关于laravel中表关系的一对一、一对多、多对一、多对多实践的更多相关文章
- 【个人笔记】《知了堂》MySQL三种关系:一对一,一对多,多对多。
一对一:比如一个学生对应一个身份证号.学生档案: 一对多:一个班可以有很多学生,但是一个学生只能在一个班: 多对多:一个班可以有很多学生,学生也可以有很多课程: 一对多关系处理: 我们以学生和班级之间 ...
- JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明
JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!
前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...
- JPA总结——实体关系映射(一对多@OneToMany)
JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...
- hibernate对象关系实现(一)一对多
hibernate是对jdk一个封装工具,实现对象和数据库之间数据映射.使用时涉及到四个问题:a.对象之间的关系在类中的体现:b,对象关系对应的数据库中表之间体现:c.实现a,b在hibernate的 ...
- 初学者易上手的SSH-hibernate04 一对一 一对多 多对多
这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
- Mybatis学习第四天——一对一&&一对多
两表关系: 1.Mybatis中一对一关系 <!-- 两表联查,通过相同属性user_id left join 表示以左边的表为主表 --> <select id="fin ...
随机推荐
- ejs常用功能函数
利用<%- include filename %>加载其他页面模版: 1.缓存功能,能够缓存已经解析好的html模版: 2.<% code %>用于执行其中javascript ...
- linux命令行安装teamviewer
teamviewer最新版本为14,但是Ubuntu14.04不支持,安装13版本即可. sudo dpkg -i teamviewer_13.2.26559_amd64.deb若报错,即缺少依赖,运 ...
- 【HNOI 2018】毒瘤
Problem Description 从前有一名毒瘤. 毒瘤最近发现了量产毒瘤题的奥秘.考虑如下类型的数据结构题:给出一个数组,要求支持若干种奇奇怪怪的修改操作(例如给一个区间内的数同时加上 \(c ...
- JavaScript 的 this 原理
一.问题的由来 学懂 JavaScript 语言,一个标志就是理解下面两种写法,可能有不一样的结果. var obj = { foo: function () {} }; var foo = obj. ...
- Unity日常记录 - QualitySettings 性能设置
unity打包时,可通过QualitySettings优化图像性能,这是最常设置也是最明显的图像性能体现 设置图形质量的水平,一般来说,质量是以牺牲性能为代价的,所以最好不要追求移动设备或旧硬件的最高 ...
- python-*args和**kwargs作用和区别
1. *args 不定长的参数:*args 无论你传递一个参数还是二个还是多个都可以.(*args传入的是无命名参数,例如:add(1,2,3,4,5)存储的是元祖)args可以自定义其他名称 def ...
- Jieba库使用和好玩的词云
jieba库的使用: (1) jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式.全模式和搜索引擎模式,下面是三种模式的特点. 精确模式:试图将语句最精 ...
- jieba库的使用和好玩的词云
1.jieba库基本介绍 (1).jieba库概述 jieba是优秀的中文分词第三方库 - 中文文本需要通过分词获得单个的词语 - jieba是优秀的中文分词第三方库,需要额外安装 - ...
- Flex4之皮肤定制
Flex4之皮肤定制[Skin类和Skin类] 博客分类: RIA-Flex4专栏 FlexAdobeUPFlashUI 第一.关于spark.skin.SparkSkin类的 1. ...
- Log4Net 常见格式说明(不断更新中)
用户名 %username pc版本 另起一行 %newline