这是转载的文章

出处: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. ASP.NET - Validators

    ASP.NET validation controls validate the user input data to ensure that useless, unauthenticated, or ...

  2. Gridview标题头添加排序图片

    向gridview标题头中添加排序图片,当点击某一个头标题时,在标题中出现升序箭头向上的图片,再点击一次时降序,在标题中出现箭头向下的图片,初始页面时在标题头中并不现实任何图片. 先定义好一个grid ...

  3. Cent OS & Windows 双系统自定义引导菜单

    系统环境 系统:Windows 10 (64-bit) & Cent OS 7 (64-bit) 引导程序:Grub2 编辑 grub.cfg 为了方便,在终端使用命令 su 输入密码进入超级 ...

  4. selenium中CSS选择器定位

    selenium元素定位,CSS选择器定位效率会高很多. CSS选择器用于选择你想要的元素的样式的模式.表格摘自“菜鸟教程”,具体用法可去查阅 选择器 示例 示例说明 CSS .class .intr ...

  5. jmeter 学习笔记

    beanshell内置对象 vars是针对单线程,使用${varName}访问var变量值 props是所有线程共享,使用${__P(propName,)}访问prop变量值 如何让variable在 ...

  6. php list()函数

    说明: (PHP 4, PHP 5, PHP 7) list — 把数组中的值赋给一组变量 像 array() 一样,这不是真正的函数,而是语言结构. list() 可以在单次操作内就为一组变量赋值. ...

  7. laravel——ajax分页&删除&搜索

    一.视图代码 /*搜索*/<form action="javascript:search_brand()" name="searchForm"> & ...

  8. c#泛型约束 (where T:class)

    .NET支持的类型参数约束有以下五种:where T : struct                               | T必须是一个结构类型where T : class       ...

  9. samtools 使用简述

    功能如下: 1.View 主要功能讲sam文件转位bam文件. 涉及的参数: -b 输出bam格式..默认是sam文件 -h 输出的sam文件带header..默认不带 -H 仅仅输出header - ...

  10. VS2017生成带图标的QT项目方法

    仅仅是为了记录,避免以后忘记. 1.拷贝图标到代码文件夹下,与vcxproj文件保持在同一级目录 2.新建gisApp.txt文件,然后将后缀名改为.rc,并写入下面的文本 IDI_ICON1 ICO ...