这是转载的文章

出处: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中表关系的一对一、一对多、多对一、多对多实践的更多相关文章

  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. 优雅的使用Linux

    优雅的使用Linux 系统安装 启动盘制作 通过rufus烧制官网镜像,注意根据自己系统的引导模式选择相应模式,不确定的,可以在windows中通过Win + R 快捷键调出"运行" ...

  2. iOS QQ 扫一扫 捷径URL

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. Moqui 代码解释

    Service: entity-find 和 entity-find-one 的区别: <entity-find entity-name="" list="&quo ...

  4. 用Python实现简单通讯录

    一个简单的通讯录例子 #!/usr/bin/python __author__ = 'fierce' #coding:utf-8 import os #引用os模块 import pickle #应用 ...

  5. scrapy爬虫具体案例步骤详细分析

    scrapy爬虫具体案例详细分析 scrapy,它是一个整合了的爬虫框架, 有着非常健全的管理系统. 而且它也是分布式爬虫, 它的管理体系非常复杂. 但是特别高效.用途广泛,主要用于数据挖掘.检测以及 ...

  6. 蚂蚁风险大脑亮相ATEC城市峰会:为数字经济时代做好“安全守护”

    2019年1月4日,以“数字金融新原力(The New Force of Digital Finance)”为主题的蚂蚁金服ATEC城市峰会在上海隆重举行.大会聚焦金融数字化转型,分享新技术的发展趋势 ...

  7. [CQOI2014]数三角形

    [CQOI2014]数三角形 给定\(n\times m\)的网格,求三个点在其格点上的三角形个数,1<=m,n<=1000. 解 法一:直接 显然为组合计数问题,关键在于划分问题,注意到 ...

  8. js实现获取对象key名

    使用for in遍历对象时,需要用hasOwnProperty(key)方法过滤掉非对象自身的属性(继承自原型链的属性) var obj = { "name" : "zh ...

  9. C# List<string> to string

    List<string> names = new List<string>() { "John", "Anna", "Moni ...

  10. yml多环境配置

    配置独立各自的环境 注:如果需要修改环境测试,只需要修改spring: profiles: active: “环境名” spring: profiles: active: prd --- #开发环境配 ...