Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Yii2中使用模型连接表

在Yii2中使用模型连接表
EN

Stack Overflow用户
提问于 2018-07-11 03:59:59
回答 2查看 6.5K关注 0票数 1

我是table1

代码语言:javascript
运行
AI代码解释
复制
id1  Name
------------
 1   value1
 2   value2

我是table2

代码语言:javascript
运行
AI代码解释
复制
id2  Name     id1
---------------------
 1   value1    2
 2   value2    1

我是table3

代码语言:javascript
运行
AI代码解释
复制
id3  Name     id2
---------------------
 1   value1    2
 2   value2    1

我是table4

代码语言:javascript
运行
AI代码解释
复制
id4  Name     id3
---------------------
 1   value1    2
 2   value2    1

我想将Yii2中的上述4个表与模型连接起来。

代码语言:javascript
运行
AI代码解释
复制
select * from table1 
left join table2 on table2.id2 = table1.id1
left join table3 on table2.id3 = table1.id2
left join table4 on table2.id4 = table1.id3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-11 04:49:36

1.使用Yii2 ActiveQuery

Step-1:声明关系

要使用活动记录处理关系数据,首先需要在活动记录类中声明关系。任务很简单,只需为每个感兴趣的关系声明一个关系方法,如下所示,

代码语言:javascript
运行
AI代码解释
复制
class TableOneModel extends ActiveRecord
{
    // ...
    public function getTableTwo()
    {
        return $this->hasMany(TableTwoModel::className(), ['id1' => 'id1']);
    }
}

class TableTwoModel extends ActiveRecord
{
    // ...
    public function getTableThree()
    {
        return $this->hasMany(TableThreeModel::className(), ['id2' => 'id2']);
    }
}
.....
same create table3 and table4 relation

如果用hasMany()声明关系,则访问该关系属性将返回相关活动记录实例的数组;如果用hasOne()声明关系,则访问关系属性将返回相关的活动记录实例,如果没有找到相关数据,则返回null。

Step-2:访问关系数据

声明关系之后,可以通过关系名称访问关系数据。这就像访问关系方法定义的对象属性一样。因此,我们称它为关系属性。例如,

代码语言:javascript
运行
AI代码解释
复制
$query = TableOneModel::find()
           ->joinWith(['tableTwo.tableThree'])
           ->all();

请参考yii\db\ActiveQuery

2.使用Yii2数据库查询

代码语言:javascript
运行
AI代码解释
复制
$query = (new \yii\db\Query())
        ->from('table1 as tb1')
        ->leftJoin('table2 as tb2', 'tb1.id1 = tb2.id1')
        ->leftJoin('table3 as tb3', 'tb2.id2 = tb3.id2')
        ->leftJoin('table4 as tb4', 'tb3.id3 = tb4.id3')
        ->all();

请参考查询生成器文档leftJoin()

票数 4
EN

Stack Overflow用户

发布于 2018-07-11 04:08:22

使用Gii生成模型,如果外键在数据库中定义得很好,那么这些关系将在您的模型中生成。如果没有,那么你可以自己定义关系。请参见如何在Yii2模型中定义这些关系。

然后,您应该能够通过这样做来访问模型Table4的属性:

代码语言:javascript
运行
AI代码解释
复制
$table1 = Table1::findById(1);

var_dump($table1->table2->table3->table4->attributes);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51284947

复制
相关文章
html中的链接不添加http(协议相对 URL)
https://www.fgba.net/static/image/common/logo.png
曾高飞
2021/09/22
2.2K0
我的编程导航
大家用了我的编程导航学习效果没有长,但是学习效果也没有降下了。下面我来讲解一下我做的编程导航。
海曈
2022/11/14
2270
iOS导航栏切换界面时隐藏和显示
现如今很多App的一些模块,尤其是个人中心模块,界面设计已经习惯于不保留导航栏,而是直接将界面背景覆盖到状态栏,比如QQ的个人信息界面:
Cloudox
2021/11/23
4K0
iOS导航栏切换界面时隐藏和显示
html 竖排导航条,html 导航栏
$(“#navbar a[href='{ { request.path }}’]”).parent().addClass(“active”)
全栈程序员站长
2022/09/01
3.7K0
HTML中的超链接
本文主要介绍了超链接的概念以及其在网页中的应用,包括http链接、本地链接、ftp链接和邮箱链接等,并重点讲解了锚点的定义和用法。
IT可乐
2018/01/04
4.2K0
知网的链接构造
[图片上传中...(b.PNG-e14d48-1540698054808-0)]
热心的社会主义接班人
2018/12/04
6880
知网的链接构造
Html的空格显示
全角空格被解释为汉字,所以不会被被解释为HTML分隔符,能够依照实际的空格数显示。
全栈程序员站长
2022/07/11
3.6K0
资源 | 站在巨人的肩膀,这才是刷算法的正确姿势
随着中国程序员越来越多,如今,想要通过大厂的面试或者拿到一份高薪 offer,不仅要有过硬的岗位相关的专业知识和实践经历,更重要的是要有扎实的算法基本功。每一轮面试都可能需要完成 1 ~ 3 道算法题,无数的同学因为算法这道门槛而被大厂拒之门外。
程序员鱼皮
2020/11/25
8990
资源 | 站在巨人的肩膀,这才是刷算法的正确姿势
基于Vue+Element框架的韩小韩简约导航网
最近学了一下Vue感觉Element框架不仅简约而且优美,我真的好喜欢好喜欢,特别响应式布局这块,练手就随意写了一个导航网,非常简约,数据存储在QQ收藏里,连接,说明,公告等随时添加更改,极其方便。
骤雨重山
2022/01/17
9620
基于Vue+Element框架的韩小韩简约导航网
HTML DOM 导航
getElementsByTagName() 方法返回节点列表。节点列表是一个节点数组。
陈不成i
2021/07/21
6870
HTML_导航
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>样式学习</title> <style> #navigator{ text-align: center; } .item{
bye
2020/11/24
1.1K0
html语言代码超链接,html 超链接 word html超链接代码
“打开/保存”是因浏览者的浏览器而异的,假如浏览者的电脑没有装word软件,那么,无论什么情况,都是打不开的,你只能选择保存(选择打开的话,电脑会让你选择使用什么软件来打开);如果浏览者的电脑装了word软件,那么如果电脑的安全级别高一些,一样会提示“打开/保存”,为的是防止直接打开病毒文件。
全栈程序员站长
2022/09/14
21.2K0
ASP.NET的导航链接问题求助
在VS2008里面开发完全正常,但是在IIS5.1里面默认网站里面新增一个虚拟目录的制定到这个网页里面的话在浏览器里面http://localhost/查看就是可以显示,但是里面的链接全部不正常。 举例:虚拟目录的名称为meng,那么我们要访问我们的网站就要这样:http://localhost/meng/Default.aspx 这样首页是出来了,但是里面的链接都不是以http://localhost/meng/开头,而是以http://localhost/开头!!也就是说我网站目录里面有一个Gu
SAP梦心
2022/05/10
1.4K0
HTML导航菜单
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159456.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/17
6.1K0
HTML内的锚点链接
作者:matrix 被围观: 5,207 次 发布时间:2013-03-14 分类:兼容并蓄 | 无评论 »
HHTjim 部落格
2022/09/26
2.2K0
[Golang] gin框架模板渲染html-不显示转码html实体
默认的gin框架模板中,如果模板变量是html文本 展示模板变量的时候是以html实体的形式出现的,不是以html形式渲染的 这个时候,就需要在传递变量的时候简单处理一下 template.HTML类型转换一下
唯一Chat
2022/02/22
4.5K0
[Golang] gin框架模板渲染html-不显示转码html实体
年轻时,我不写单元测试
当我们被提出这些bug的时候,我们是二脸懵逼的,因为这不符合一个程序员的预期!!! 那么我们如何能够避免以上的问题,从而将经历投入到更多的开发(写bug)中去呢? 笔者在这里试着归纳了一下解决问题的办法
2014v
2019/11/20
8850
我在测试移动弱网时踩过的坑|洞见
安丛 ThoughtWorks 什么是弱网测试 在当今移动互联网盛行的时代,网络的形态除了有线连接,还有2G/3G/Edge/4G/Wifi等多种手机网络连接方式。不同的协议、不同的制式、不同的速率,使移动应用运行的场景更加丰富。 从测试角度来说,需要额外关注的场景就远不止断网、网络故障等情况了。对于弱网的数据定义,不同的应用所界定的含义是不一样且不清晰的,不仅要考虑各类型网络最低速率,还要结合业务场景和应用类型去划分。按照移动的特性来说,一般应用低于2G速率的都属于弱网,也可以将3G划分为弱网。
ThoughtWorks
2018/04/17
2.2K0
我在测试移动弱网时踩过的坑|洞见
html中超链接使用_HTML超链接代码
html超链接的写法是e69da5e6ba903231313335323631343130323136353331333431353431使用a标签,如:百度一下,你就知道。
全栈程序员站长
2022/09/18
1.3K0
SpringMVC 文件下载时 浏览器不能正确显示另存的文件名
问题:通过打印输出流的方式把文件下载到本地,但是在firebox 中 下载的文件不显示文件的文件名,造成文件不能直接打开,其他浏览器可以直接打开. 原因: 主要是文件名称中有汉字而没有转码造成firebox浏览器不能正确显示另存的文件名 解决方案: //提供如下工具类将 文件名编码 就可以啦 public static String toUtf8String(HttpServletRequest request, String s) {          String agent = request.ge
冷冷
2018/02/08
1.2K0

相似问题

Facebook搜索是如何工作的?

12

Facebook聊天是如何工作的?

20

facebook token是如何工作的?

130

Facebook AppRunner是如何工作的?

11

Facebook是如何实时工作的?

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文