laravel中表与表之间的关系是什么

这篇文章主要介绍了laravel中表与表之间的关系是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

首先关于表与表之间的关系

laravel中表与表之间的关系是什么

1.一对一

2.一对多

3.多对一

4.多对多

区分父表与子表

1.”一”的是父表

2.”多”的一方是子表

如何处理一对多关系

在子表中建一个字段(外键)指向父表

如何处理多对多关系

建立一张中间表,将”多对多”关系转化为”一对多”

案例分析

表一: 用户表(it_user)

表二: 用户详情表(it_user_info)

表三: 文章表(it_article)

表四: 国家表(it_country)

表五: 用户角色表(it_role)

① 一对一

用户表(表一)与详情表(表二)就是一对一的关系

②一对多

用户表(表一)与文章表(表三)就是一对多的关系

③多对一

用户表(表一)与国家表(表四)就是多对一的关系

④多对多

用户表(表一)与角色表(表五)就是多对多的关系

用户表建表及测试数据

DROPTABLEIFEXISTS`it_user`;
CREATETABLE`it_user`(
`id`int(10)unsignedNOTNULLAUTO_INCREMENTCOMMENT'主键',
`name`varchar(64)DEFAULTNULLCOMMENT'用户名',
`password`char(32)DEFAULTNULLCOMMENT'密码(不使用md5)',
`country_id`int(11)DEFAULTNULL,
PRIMARYKEY(`id`),
KEY`国家id`(`country_id`)
)ENGINE=MyISAMAUTO_INCREMENT=6DEFAULTCHARSET=utf8;
------------------------------
--Recordsofit_user
------------------------------
INSERTINTO`it_user`VALUES('1','xiaoming','123456','1');
INSERTINTO`it_user`VALUES('2','xiaomei','123456','1');
INSERTINTO`it_user`VALUES('3','xiaoli-new','123','1');

用户详情表建表及测试数据

------------------------------
--Tablestructureforit_user_info
------------------------------
DROPTABLEIFEXISTS`it_user_info`;
CREATETABLE`it_user_info`(
`user_id`int(11)NOTNULLAUTO_INCREMENT,
`tel`char(11)DEFAULTNULL,
`email`varchar(128)DEFAULTNULL,
`addr`varchar(255)DEFAULTNULL,
PRIMARYKEY(`user_id`)
)ENGINE=MyISAMAUTO_INCREMENT=4DEFAULTCHARSET=utf8;
------------------------------
--Recordsofit_user_info
------------------------------
INSERTINTO`it_user_info`VALUES('1','13012345678','xiaoming@163.com','北京');
INSERTINTO`it_user_info`VALUES('2','15923456789','xiaomei@163.com','上海');
INSERTINTO`it_user_info`VALUES('3','18973245670','xiaoli@163.com','武汉');

文章表建表及测试数据

------------------------------
--Tablestructureforit_article
------------------------------
DROPTABLEIFEXISTS`it_article`;
CREATETABLE`it_article`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`title`varchar(255)DEFAULTNULL,
`content`text,
`user_id`int(11)DEFAULTNULL,
PRIMARYKEY(`id`),
KEY`user_id`(`user_id`)
)ENGINE=MyISAMAUTO_INCREMENT=4DEFAULTCHARSET=utf8;
------------------------------
--Recordsofit_article
------------------------------
INSERTINTO`it_article`VALUES('1','世界那么大,我想去看看','钱包那么小,总是不够','1');
INSERTINTO`it_article`VALUES('2','我想撞角遇到爱','却是碰到鬼','2');
INSERTINTO`it_article`VALUES('3','哈哈哈哈','嘻嘻嘻嘻','1');

国家表建表及测试数据

------------------------------
--Tablestructureforit_country
------------------------------
DROPTABLEIFEXISTS`it_country`;
CREATETABLE`it_country`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`name`varchar(255)DEFAULTNULL,
PRIMARYKEY(`id`)
)ENGINE=MyISAMAUTO_INCREMENT=3DEFAULTCHARSET=utf8;
------------------------------
--Recordsofit_country
------------------------------
INSERTINTO`it_country`VALUES('1','中国');
INSERTINTO`it_country`VALUES('2','美国');

用户角色表建表及测试数据

------------------------------
--Tablestructureforit_role
------------------------------
DROPTABLEIFEXISTS`it_role`;
CREATETABLE`it_role`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`name`varchar(255)DEFAULTNULL,
PRIMARYKEY(`id`)
)ENGINE=MyISAMAUTO_INCREMENT=5DEFAULTCHARSET=utf8;
------------------------------
--Recordsofit_role
------------------------------
INSERTINTO`it_role`VALUES('1','开发');
INSERTINTO`it_role`VALUES('2','测试');
INSERTINTO`it_role`VALUES('3','管理');

用户和角色中间表表建表及测试数据

------------------------------
--Tablestructureforit_user_role
------------------------------
DROPTABLEIFEXISTS`it_user_role`;
CREATETABLE`it_user_role`(
`user_id`int(11)DEFAULTNULL,
`role_id`int(11)DEFAULTNULL,
KEY`role_id`(`role_id`),
KEY`user_id`(`user_id`)
)ENGINE=MyISAMDEFAULTCHARSET=utf8;
------------------------------
--Recordsofit_user_role
------------------------------
INSERTINTO`it_user_role`VALUES('1','1');
INSERTINTO`it_user_role`VALUES('1','2');
INSERTINTO`it_user_role`VALUES('1','3');
INSERTINTO`it_user_role`VALUES('2','1');
INSERTINTO`it_user_role`VALUES('3','2');

准备工作

1、规划路由

在routes/web.php下写如下路由:

//ORM的关联关系
Route::get('/orm/relation/{mode}','ORM\UserController@relation');

2、在App/Http/Controllers/ORM/UserController.php编写relation方法

publicfunctionrelation($mode)
{
switch($mode){
case'1_1':
{
//一对一
}
break;
case'1_n':
{
//一对多
}
break;
case'n_1':
{
//多对一
}
break;
case'n_n':
{
//多对多
}
break;
default;
}
}

3、安装debug调试工具

3.1使用composer命令安装

composerrequirebarryvdh/laravel-debugbar

3.2、修改config/app.php文件,加载debugbar到laravel到项目中,在’providers’数组中加入如下配置:

Barryvdh\Debugbar\ServiceProvider::class,

除了安装debugbar调试工具外,也可以使用查询监听:编providers/AppServiceProvider.php的boot方法中加入如下代码

\DB::listen(function($query){
var_dump($query->sql);
var_dump($query->bindings);
echo'<br>';
});

也可以打印出执行的sql语句。

一对一

1、创建Userinfo模型对象

进入cmd命令行进入laravel项目所在目录执行以下命令

phpartisanmake:modelUserinfo

会在App目录下生成Userinfo.php

2、编辑Userinfo模型文件

<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classUserinfoextendsModel
{
protected$table='user_info';
protected$primaryKey='user_id';
protected$fillable=['user_id','tel','email','addr'];
public$timestamps=false;
}

3、编写UserModel, 加入一对一方法

<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classUserModelextendsModel
{
protected$table='user';//真是表名
protected$primaryKey='id';//主键字段,默认为id
protected$fillable=['name','password'];//可以操作的字段
public$timestamps=false;//如果数据表中没有created_at和updated_id字段,则$timestamps则可以不设置,
默认为true
publicfunctionUserinfo()
{
/*
*@param[string][name][需要关联的模型类名]
*@param[string][foreign][参数一指定数据表中的字段]
**/
return$this->hasOne('App\Userinfo','user_id');
}

4、编写UserController, 调用一对一方法

publicfunctionrelation($mode)
{
switch($mode){
case'1_1':
{
//一对一
$data=UserModel::find(1)->Userinfo()->get();
dd($data);
}
break;
default;
}
}

一对多

1、创建article模型对象

执行命令

phpartisanmake:modelArticle

在app下生成Article.php文件

2、编写article模型文件

<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classArticleextendsModel
{
protected$table='article';
protected$primaryKey='id';
protected$fillable=['id','title','content','user_id'];
public$timestamps=false;
}

3、编写UserModel, 加入一对多方法

publicfunctionArtice()
{
return$this->hasMany('App\Article','User_id');
}

4、编写UserController,调用一对多方法

publicfunctionrelation($mode)
{
switch($mode){
case'1_1':
{
//一对一
$data=UserModel::find(1)->Userinfo()->get();
dd($data);
}
break;
case'1_n':
{
//一对多
$data=UserModel::find(1)->Artice()->get();
dd($data);
}
break;
default;
}
}
}

多对一

1、创建country模型对象

执行命令

phpartisanmake:modelCountry

2、编写country模型文件

<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classCountryextendsModel
{
protected$table='country';//真实表名
protected$primaryKey="id";//主键id
protected$fillable=['id','name'];//允许操作的字段
public$timestamps=false;//如果数据表中没有created_at和updated_id字段,则$timestamps则可以不设置,
默认为true
}

3、编写UserModel, 加入多对一方法

publicfunctionCountry()
{
return$this->belongsTo('App\Country','country_id');
}

4、编写UserController, 调用方法

publicfunctionrelation($mode)
{
switch($mode){
case'1_1':
{
//一对一
$data=UserModel::find(1)->Userinfo()->get();
dd($data);
}
break;
case'1_n':
{
//一对多
$data=UserModel::find(1)->Artice()->get();
dd($data);
}
break;
case'n_1':
{
//多对一
$data=UserModel::find(1)->Country()->get();
dd($data);
}
break;
default;
}
}
}

多对多

1、创建role模型对象

执行命令

phpartisanmake:modelRole

执行命令

phpartisanmake:modelUser_role

2、编写Role模型

<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classRoleextendsModel
{
protected$table='role';
protected$primaryKey="id";
protected$fillable=['name'];
public$timestamps=false;
}

编写User_role模型

因为表中没有主键字段,所以需要两个字段即可

<?php
namespaceApp;
useIlluminate\Database\Eloquent\Model;
classUser_roleextendsModel
{
protected$table='user_role';
public$timestamps=false;
}

3、编写UserModel, 加入多对多方法

publicfunctionRole(){
/*
*第一个参数:要关联的表对应的类
*第二个参数:中间表的表名
*第三个参数:当前表跟中间表对应的外键
*第四个参数:要关联的表跟中间表对应的外键
**/
return$this->belongsToMany('App\Role','user_role','user_id','role_id');
}

4、编写UserController, 调用多对多方法

publicfunctionrelation($mode)
{
switch($mode){
case'1_1':
{
//一对一
$data=UserModel::find(1)->Userinfo()->get();
dd($data);
}
break;
case'1_n':
{
//一对多
$data=UserModel::find(1)->Artice()->get();
dd($data);
}
break;
case'n_1':
{
//多对一
$data=UserModel::find(1)->Country()->get();
dd($data);
}
break;
case'n_n':
{
//多对多
$data=UserModel::find(2)->Role()->get();
dd($data);
}
break;
default;
}
}

总结:

1、一对一使用方法:hasOne()

2、一对多使用方法:hasMany()

3、多对一使用方法:belongsTo()

4、多对多使用方法:belongsToMany()

感谢你能够认真阅读完这篇文章,希望小编分享的“laravel中表与表之间的关系是什么”这篇文章对大家有帮助,同时也希望大家多多支持恰卡编程网,关注恰卡编程网行业资讯频道,更多相关知识等着你来学习!

发布于 2021-03-17 20:51:05
收藏
分享
海报
0 条评论
169
上一篇:Bootstrap中的栅格系统是什么 下一篇:Laravel模型事件的示例分析
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码