Yii2中多表关联查询
准备条件:
1、首先准备两张表:
customer(用户表)(id, name)
order(订单表)(id, customer_id, price)
customer 表和 order 表之间是一对多的关系,通过 customer_id 字段关联。
2、建立相应的模型文件 customer.php 和 order.php 文件。
关联查询:
customer.php文件添加getOrder()方法:
<?php namespace app\models; use Yii; /**
* This is the model class for table "customer".
*
* @property int $id
* @property string $name 用户姓名
*/
class Customer extends \yii\db\ActiveRecord
{
/**
* 获取订单信息
*/
public function getOrder()
{
// 一个用户对应多个订单,一对多的关系使用hasMany()关联
return $this->hasMany(Order::className(), ['customer_id' => 'id'])->asArray();
} }
order.php文件添加getCustomer()方法:
<?php namespace app\models; use Yii; /**
* This is the model class for table "order".
*
* @property int $id
* @property int $customer_id 用户id
* @property string $price 价格
*/
class Order extends \yii\db\ActiveRecord
{
/**
* 获取用户信息
*/
public function getCustomer()
{
// 一个订单对应一个用户,一对一的关系使用hasOne()关联
return $this->hasOne(Customer::className(), ['id' => 'customer_id'])->asArray();
}
}
使用:
// 查询客户名为张三的订单信息
$customer = Customer::find()->where(['name' => '张三'])->one();
// 可以通过$customer->getOrder()方法调用customer.php模型中getOrder()方法
$orders = $customer->getOrder()->all();
// 也可以使用$customer->order属性调用,
// 当程序没有找到order属性时,PHP会调用__get()函数,程序会自动寻找getOrder()方法调用
// 这里不用加all(),程序会自动识别,如果使用的是hasMany则加all(),hasOne则加上one()
$orders = $customer->order;
var_dump($orders);exit; // 查询订单id为1的客户信息
$order = Order::find()->where(['id' => 1])->one();
// 调用order.php模型中getCustomer()方法
$customer = $order->customer;
var_dump($customer);exit;
with 和 joinWith 的使用:
使用上面的关联查询时有个问题就是数据量大的时候性能问题。
$customers = Customer::find()->all(); // 相当于执行 select * from customer
foreach ($customers as $customer) {
$orders = $customer->order; // 相当于执行 select * from order where customer_id = id;
}
假如$customers中有100条数据,则要循环查询100次,整个程序需要执行SQL语句101次。
这时可以使用with():
// 相当于执行了两条SQL语句 select * from customer
// select * from order where customer_id in(...)
$customers = Customer::find()->with('order')->asArray()->all();
foreach ($customers as $customer) {
$orders = $customer['order']; // 取得order表的关联数据
}
joinWith()的用法和with()差不多,joinWith()可以指定连接类型,默认LEFT JOIN连接。
注意点:
1、在模型中定义hasMany,hasOne方法时,最好不要加上all(),one()。调用$customer->order时程序会自动根据使用的是hasMany还是hasOne加上相应的all(), one()。
2、使用with(), joinWith() 查询时,如果在模型中定义hasMany,hasOne方法时加上了all(),one(),程序会报错。
Yii2中多表关联查询的更多相关文章
- Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name ...
- [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name cu ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
- Yii2中多表关联查询(hasOne、hasMany、join、joinwith)
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name customer_id ...
- Yii2中多表关联查询(with、join、joinwith)
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name custome ...
- RDIFramework.NET 中多表关联查询分页实例
RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为 ...
- MyBatis 中两表关联查询MYSQL (14)
MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...
- 【SQL】在SQL Server中多表关联查询问题
好久没有写SQL语句的多表连接查询,总在用框架进行持久化操作.今天写了一个多表关联查询,想根据两个字段唯一确定一条数据 失败的案例如下: SELECT cyb.id,ad.name FROM [Gen ...
随机推荐
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(4)- OTP及其烧写方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的OTP. 在i.MXRTxxx启动系列第二篇文章 Boot配置(ISP Pin, OTP) 里痞子 ...
- 特殊权限set_uid、set_gid、stick_bit、软链接、硬链接文件 使用介绍
第2周第4次课(3月29日) 课程内容:2.18 特殊权限set_uid2.19 特殊权限set_gid2.20 特殊权限stick_bit2.21 软链接文件2.22 硬链接文件 2.18 ...
- lvm_lv_extend
根分区lv扩容 xfs格式 neokylinV7.0 [root@localhost ~]# fdisk /dev/vda 欢迎使用 fdisk (util-linux 2.23.2). 更改将停留在 ...
- Maven项目多环境之间的配置文件的切换
前言:对于一个项目,开发和生产环境之间会使用不同的配置文件,最简单的例子就是数据库连接池的配置了.当然,可以在打包上线前对配置文件进行替换,不过这也太low了吧. 简单的pom.xml中的配置内容 比 ...
- DevOps组织中应用架构师的新定位与实践
[摘要] 针对应用架构师相关窘境,在现代化的应用开发中,DevOps组织需要定义应用架构师职责,使应用架构师与DevOps团队各角色更有效的沟通,交付更有价值的产品.在多数情况下,应用架构师不是Dev ...
- mysql 授权用户 主从和备份
1.授权用户 mysql -uroot -p123qqq...A 进入数据库 grant all on *.* to dc@&q ...
- [TimLinux] Python 自定义描述符
1. 含义 在类中,含有属性(该属性需要存在类对象到__dict__属性中,不能为存在示例对象的__dict__属性中),对属性对操作(访问,设置值,删除)可以自定义行为,这样对自定义行为成为自定义属 ...
- nitacm第十六届浙江大学宁波理工学院程序设计大赛总结
校赛时间:2019.11.30周六下午12:00-16:00 重现赛链接:https://ac.nowcoder.com/acm/contest/2995#question 体验: 11点多到达石鳞大 ...
- 最简单易懂的linux系统基础优化
第10章 linux的系统优化 10.1 系统的版本,内核查看 10.1.1 系统版本的查看 [root@oldboy6666 ~]# cat /etc/redhat-release CentOS L ...
- ajax来获取JWT的token
AJAX方式获取token需要用