| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> PHP知识库 -> thinkPHP6.0入门笔记(七)——关联模型 -> 正文阅读 |
|
[PHP知识库]thinkPHP6.0入门笔记(七)——关联模型 |
thinPHP6.0的关联模型及关联方法![]() 1.一对一关联1.1一对一关联查询????结合之前的设计,我们已经有了用户数据的增删查改,接下来我们利用一对一关联实现为用户增加个人喜好。在数据库中创建tp_hobby数据表如下:
解释:一般这里的函数名和被正向关联的数据表一致,这个是为了可读性,其实修改函数名同样可行。在hasOne函数的三个参数中,第一个参数是关联的数据模型(一般一个模型对应一个数据表),也可以写成’Hobby’,上述增加::class的写法“更加优雅”,第二个参数是被关联的数据表的键值(被称为“外键”),第三个参数是发起关联的数据表的键值(被称为“内键”),第二个参数和第三个参数是可省略的。
并在{block name=“js”}{/block}代码块中增加如下方法:
结果发现报错如下:
果然解决了问题,得到的效果展示如下: 1.2一对一关联新增????数据关联展示只是一部分,接下来希望能够实现数据的关联新增。首先,在create.html页面中增加个人喜好: 然后,在app/controller/User.php文件中找到save方法,在其中调用Usermodel的create方法之后写入如下代码:
解释:通过id找到对应的数据字段,然后跳转到关联数据表对应字段新增数据字段,新增用户关联成功结果展示如下: 1.3一对一关联删除????接下来尝试进行数据的关联删除,在delete方法中将Usermodel调用destroy方法部分改写成如下代码:
注意:经过尝试发现不写with()方法关联查询数据表,实际上不能达到关联删除的目的,只会删除主表,副表数据依然会保留(部分文章介绍关联查询时没写with,其实是错误的)。 1.4一对一关联修改????接下来就是关联修改了,通过尝试发现,关联修改是无法直接实现的。下面来详细分析修改的各种写法的效果。
(2)第二种代码,代码如下:
解释:上述代码是先找到对应的关联副表,然后修改数据,最终只能完成修改副表。需要补充的是如果hobby写成hobby(),系统不会报错,实现的效果也将是一样的。但是需要明确的是hobby关联与hobby()方法两者对于数据的处理是不一样的,eg. 如果后面接的是如下代码,二者的区别才会真正显示出来:
表现的效果为,前者将会在对应$id处修改成save中的对应的hobby(也就是test,之前表单中的内容会被掩盖掉),而hobby()则不一样,hobby()将会新增数据,其执行过程为先修改然后将save中的数据增加到副表中。但是由于唯一键的限制,在副表中会由于id重复出错,报如下bug:
解释:update必须含有至少一个参数,save方法的底层其实就是没有数据便增加有数据就修改(这里的id是固定存在的,因此save也是修改),together参数需要为数组,最终实现的效果是只能修改主表,因为这个方式副表关联无效;需要说明的是第三行代码有些文章是认为可以实现关联修改,但是实际上并不能够修改副表。 ?????同样的,反向关联也是如此,比如新建一个grade类,利用该类反向绑定用户列表,对应的数据表结构如下:
之后在controller目录下新建Grade.php并增加如下方法进行数据测试:
成功展示了id=1对应的user_id在被反向关联的数据表tp_user中蜡笔小新的数据,结果展示如下: 2.一对多关联????其实一对多关联和一对一关联有很多类似的地方。为了满足这个需求,在hobby中设置多个hobby对应同一个人,比如给蜡笔小新多设置一个hobby,得到的数据表如下:
测试在controller/User.php中加入如下测试代码:
得到运行结果如图: 2.1一对多关联模型常用方法????通常,对于一对多关联模型有如下函数处理方法:
解释:和前面一样,这里的hobby是一种属性,而hobby()应该理解成一种方法。
注:需要补充说明的是,这里并不建议使用第一种方法获取数据,因为第一种数据的二级筛选下标与根据原来的数据下标一致,比如在原来的附表中,主表中id=1的用户有多个喜好,对应了一个喜好数组,但是通过条件查询,第一种方法会将这个和附条件的数据连同它们在整个副表数组中的下标也抽离出来(对应的效果如下图所示),这样不便于数据的直接使用。
解释:这里的has方法是根据附表中可查数据条数作为依据,返回主表信息。第一个参数是其关联的副表名称,第二个参数是查询条件,第三个数据是数据条数。
解释:haswhere方法是通过副表数据来返回主表信息,第一个参数是副表表名,第二个参数是查询条件。补充一点这里的select返回数组下面从0开始的,并且使用find默认返回符合条件的第一个,使用select返回所有数据。 3.多对多关联????多对多关联最经典的实例便是权限控制,比如在一个用户列表中,一个用户可以对应多个管理员权限,而一种管理员权限又能够反过来对应多个用户。
解释:多对多关联的发起对象可以选择不同,那么之后的对应关系也需要相应改变,这里使用的auth作为关联的发起对象,role为关联对象,接下来的第二个参数是中间模型,第三个参数和第四个参数分别是【“外键”,“关联键”】,使用如下代码进行测试:
得到的结果如下: 3.1多对多关联新增????接下来使用户数据新增部分,对于用户数据的新增,和上面提到的一对一的数据新增一致。接着使用权限管理的多对多模型,增加管理员种类代码如下:
程序运行后的数据表结果如下:
注:这里直接写save(3)也是可以的,但是不太清晰,因此加上角色模型的find方法。同样的使用saveAll([1,2,3])同时增加多个身份也是可以的。此外,可以使用attach方法代替save方法,并且attach相比于save方法还能再传一个参数,eg.attach(RoleModel::find(3),[‘details’=>‘修改access表中的details字段’])。 参考文献????1.ThinkPHP关联删除 |
|
PHP知识库 最新文章 |
Laravel 下实现 Google 2fa 验证 |
UUCTF WP |
DASCTF10月 web |
XAMPP任意命令执行提升权限漏洞(CVE-2020- |
[GYCTF2020]Easyphp |
iwebsec靶场 代码执行关卡通关笔记 |
多个线程同步执行,多个线程依次执行,多个 |
php 没事记录下常用方法 (TP5.1) |
php之jwt |
2021-09-18 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 | -2025/2/27 5:38:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |