热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Laravel5.6ORM关联模型,一对一和一对多

Laravel5.6关联模型的操作,主要是一对一,一对多,多对多等操作.下面示例主要解析前面两个操作用法比较常用.(操作和用法TP5类似)将关联查询使用语法hasOne、hasMany、belong
Laravel5.6 关联模型的操作,主要是一对一,一对多,多对多等操作.下面示例主要解析前面两个操作用法比较常用.(操作和用法TP5类似)

将关联查询使用语法hasOne、hasMany、belongsTo进行一个举例说明?
hasOne:有一个,加上主谓语应该是, A 有一个 B
hasMany:有很多, A 有很多 B
belongsTo:属于, A 属于 B

demo示例:
假设Users模型和News模型存在关联关系.两表sql和假设数据如下:
users.sql sql文件
 1 DROP TABLE IF EXISTS `users`;
 2 CREATE TABLE `users` (
 3   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 4   `name` char(30) NOT NULL DEFAULT '' COMMENT '名称',
 5   `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
 6   `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
 7   PRIMARY KEY (`id`)
 8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
 9 
10 -- ----------------------------
11 -- Records of users
12 -- ----------------------------
13 INSERT INTO `users` VALUES ('1', 'admin_01', '2018-11-19 10:06:17', '2018-11-19 10:06:22');
14 INSERT INTO `users` VALUES ('2', 'admin_02', '2018-11-19 10:09:27', '2018-11-19 10:09:34');
15 INSERT INTO `users` VALUES ('3', 'admin_03', '2018-11-19 11:36:56', '2018-11-19 11:37:00');

news.sql sql文件
 1 CREATE TABLE `news` (
 2   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 3   `users_id` int(10) NOT NULL DEFAULT '1' COMMENT '用户表id',
 4   `author` char(30) NOT NULL DEFAULT '' COMMENT '作者',
 5   `content` text NOT NULL COMMENT '内容',
 6   `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
 7   `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
 8   PRIMARY KEY (`id`)
 9 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='新闻表';
10 
11 -- ----------------------------
12 -- Records of news
13 -- ----------------------------
14 INSERT INTO `news` VALUES ('1', '1', ' Ning', 'Hello World 01', '2018-11-19 10:08:04', '2018-11-19 10:07:59');
15 INSERT INTO `news` VALUES ('2', '2', 'Wang', 'Hello World 02', '2018-11-19 10:11:01', '2018-11-19 10:11:08');
16 INSERT INTO `news` VALUES ('3', '3', 'Li', 'Hello World 03', '2018-11-19 11:37:57', '2018-11-19 11:37:59');
17 INSERT INTO `news` VALUES ('4', '3', 'Hong', 'Hello World 04', '2018-11-19 15:02:26', '2018-11-19 15:02:29');

一对一:
例如:一个 Users 模型有一个与之关联的 News 模型.
Users.php Users模型
 1 php
 2 
 3 namespace App\Model\Eloquent\Admin;
 4 
 5 use Illuminate\Database\Eloquent\Model;
 6 
 7 class Users extends Model
 8 {
 9     protected $table = 'users';
10 
11     /**
12      * 关联news表
13      */
14     public function newsMethod()
15     {
16         //hasOne($related, $foreignKey = null, $localKey = null)
17         //第一个参数为对应的model, 第二个参数默认为model对应的表的外键, 第三个参数默认为当前模型对应的表的主键
18         return $this->hasOne('App\Model\Eloquent\Admin\News','users_id', 'id');
19     }
20 }

 

News.php News模型
 1 php
 2 
 3 namespace App\Model\Eloquent\Admin;
 4 
 5 use Illuminate\Database\Eloquent\Model;
 6 
 7 class News extends Model
 8 {
 9     protected $table = 'news';
10 
11     /**
12      * 相对关联users表
13      */
14     public function usersMethod()
15     {
16         //belongsTo($related, $foreignKey = null, $ownerKey = null, $relation = null)
17         //第一个参数为model, 先讲第四个参数,默认为调用belongsTo()的方法名字, 第二个参数默认为第四个参数加上 '_id', 第三个参数默认为model的对应表的主键
18         return $this->belongsTo('App\Model\Eloquent\Admin\Users','users_id','id');
19     }
20 }

 

关联查询 -- 查询news表关联id=1,一条数据
1 $data = Users::find(1)->newsMethod->toArray();
结果打印:


相对关联查询 -- 查询users表关联id=2,一条数据
1 $data = News::find(2)->usersMethod->toArray();
结果打印:

 
一对多
一对多关联:是定义单个模型拥有多个其它模型的关联关系.
Users.php Users模型
 1 php
 2 
 3 namespace App\Model\Eloquent\Admin;
 4 
 5 use Illuminate\Database\Eloquent\Model;
 6 
 7 class Users extends Model
 8 {
 9     protected $table = 'users';
10 
11     /**
12      * 关联news表 假设一对多
13      */
14     public function newsMethodMany()
15     {
16         return $this->hasMany('App\Model\Eloquent\Home\News','users_id', 'id');
17     }
18 }

关联查询 -- 查询users和news两表关联id=3,两条数据
1 $data = Users::find(3)->newsMethodMany->toArray();
结果打印:


查询存在的关联关系操作语法.
with:类似于 SQL 中的 left join 注:渴求加载查指定字段, id字段是必须列出
1 $data = News::with('usersMethod:id,name')->get()->toArray();

结果打印:

 
has:类似于 SQL 中的 inner join
1 $data = News::has('usersMethod')->get()->toArray();
whereHas:inner join 之后,可以补充查询条件
1 $data = News::whereHas('usersMethod', function ($query) {
2     $query->where('author', '=', 'Hong');
3 })->get()->toArray();
结果打印:



推荐阅读
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 数据类型和操作数据表2.1MySQL类型之整型2.2MySQL数据类型之浮点型2.3日期时间型DATE1支持时间:1000年1月1日~9999年12月31日DATETIME ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
author-avatar
铁匠他夫人_738
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有