[转载]关于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 ...
随机推荐
- Bootstrap3基础 栅格系统 col-md-push/pull 向左、右的浮动偏移
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- 单元测试系列之十:Sonar 常用代码规则整理(二)
摘要:帮助公司部署了一套sonar平台,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ======== ...
- jQuary学习の五のAJAX
AJAX 是与服务器交换数据的技术,它在不重载全部页面的情况下,实现了对部分网页的更新. 一.jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. loa ...
- java四则运算 界面化
本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2232 项目的地址:https://github.com/kdays ...
- (转)Extracting knowledge from knowledge graphs using Facebook Pytorch BigGraph.
Extracting knowledge from knowledge graphs using Facebook Pytorch BigGraph 2019-04-27 09:33:58 This ...
- day4——无重复字符的最长子串
// 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第2题 今日算法 题干 //给定一个字符串,请你找出其中不含有重复字符的 最长子串 ...
- centos7 mysql数据库的安装与使用
一:数据库的安装 第一步 下载数据库到主机,, 第二步 通过xshell将数据库压缩包上传至centos7虚拟主机(#注意:服务器主机需下载上传工具lrzsz 命令:yun -y install ...
- java笔记 -- java字符串
概念: Java字符串就是Unicode字符序列, Java没有内置的字符串类型, 而是在标准Java类库中提供了一个预定义类. 每个用双引号括起来的字符串都是String类的一个实例.String ...
- lua 5.3.5 安装/初体验
安装 官网http://www.lua.org/start.html 参考 https://blog.csdn.net/qq_23954569/article/details/70879672 cd ...
- tensorboard
在控制台输入: C:\Users\sunli\Documents\name\src>tensorboard --logdir=./w