这是转载的文章

出处: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. Bytom的链式交易和花费未确认的交易

    当我们基于比原做应用的时候,在构建交易过程中会遇到以下两种情况.多个地址向一个地址转账,还有一种就是从一个地址分批次向多个地址转账.那我们今天就来介绍一下这两种交易构建的具体流程,以及贴出具体实现的代 ...

  2. idea自个常用工具的总结

    1.直接打开某类:ctrl+shift+t2.注释某类:ctrl+?3. implementation :Ctrl+T4.rename:Alt +Shirft +R5.Show Intention A ...

  3. selenium python 中浏览器操作

    1.启用浏览器 browser = webdriver.Chrome()               谷歌浏览器 browser = webdriver.Firefox()              ...

  4. MapReduce实现PageRank算法(稀疏图法)

    前言 本文用Python编写代码,并通过hadoop streaming框架运行. 算法思想 下图是一个网络: 考虑转移矩阵是一个很多的稀疏矩阵,我们可以用稀疏矩阵的形式表示,我们把web图中的每一个 ...

  5. Git初识学习

    初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 使用命令git add <file>,注意,可反复多次使用,添加多个文件: 使用命令git commit ...

  6. Maven工程的POM继承

    父POM的作用是消除配置的重复. 父POM必须<packaging>pom</packaging>. 还有 <modules> <module>子模块1 ...

  7. MySQL查询缓存总结

    可以通过下面的SQL查看当前查询缓存相关参数状态: show variables like '%query_cache%'; 1)  query_cache_type 查询缓存类型: 0 表示始终不适 ...

  8. Job for docker.service failed because the control process exited with error

    Docker 无法启动 报错信息:Job for docker.service failed because the control process exited with error 找了很久才解决 ...

  9. webpack的css样式文件加载依赖

    1.需要两个依赖包: npm i style-loader css-loader -D

  10. IntelliJ IDEA 和 Pycharm 破解

    关键网址:http://idea.lanyus.com/ 步骤: 1. 在http://idea.lanyus.com/上下载:JetbrainsCrack-2.9-release-enc.jar . ...