准备条件:

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中多表关联查询的更多相关文章

  1. Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name ...

  2. [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_name       cu ...

  3. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  4. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  5. Yii2中多表关联查询(hasOne、hasMany、join、joinwith)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name  customer_id ...

  6. Yii2中多表关联查询(with、join、joinwith)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order         (id  order_name   custome ...

  7. RDIFramework.NET 中多表关联查询分页实例

    RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为 ...

  8. MyBatis 中两表关联查询MYSQL (14)

    MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...

  9. 【SQL】在SQL Server中多表关联查询问题

    好久没有写SQL语句的多表连接查询,总在用框架进行持久化操作.今天写了一个多表关联查询,想根据两个字段唯一确定一条数据 失败的案例如下: SELECT cyb.id,ad.name FROM [Gen ...

随机推荐

  1. 程序员的算法课(18)-常用的图算法:广度优先(BFS)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  2. 程序员的算法课(6)-最长公共子序列(LCS)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  3. xpath-房价爬取

    xpath xpath两种使用方式 和bs类似,一种是调用本地资源,一种是网络资源 etree.parse(filePath) etree.HTML('page_text') xpath表达式 层级: ...

  4. Django2.2 Templates 页面渲染 数据列表跳转 以及简单的页面模块继承

    声明:本博客用的为pycharm Django2.2,基于此内容,会简单讲解 数据库传参形式的增删查改(完整小项目) 路由的 位置参数.关键字参数.以及html中反向解析路由 request的表单传递 ...

  5. MyBatis的配置与使用(增,删,改,查)

    ---恢复内容开始--- Mybatis入门介绍 一.MyBatis介绍 什么是MyBtis? MyBatis 是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框 ...

  6. Java修炼——四种方式解析XML_SAX

    四种方式解析XML:DOM      JDOM    DOM4J    SAX 先写一个XML栗子: <?xml version="1.0" encoding="U ...

  7. BOM对象中的常用方法

    先看body中的内容: <body οnlοad="demo1()"> <p> <input type="button" id=& ...

  8. [TimLinux] TCP全连接队列满

    0. TCP三次握手 该图来自:TCP SOCKET中backlog参数的用途是什么? syns queue: 半连接队列 accept queue: 全连接队列 控制参数存放在文件:/proc/sy ...

  9. [TimLinux] 养成一个习惯

    1. 习惯 在博客园开博之前,大约六个月之前,我开始给自己定下坚持跑步的目标,从而养成了一个习惯.就在大约半个月前,回顾自己的工作经历的时候,发现还有一个来月自己就工作十年了,为此我树立了一个新的目标 ...

  10. AutoCAD中的螺旋究竟是什么螺旋?

    AutoCad从很早的时候就开始提供了螺旋线的功能,它的用法相对简单,非常适合用来对等距螺旋的理论进行演练. 选择螺旋线工具,首先画出一个基准圆,再向内(或向外)移动鼠标,拖出一个旋转3个周期的螺旋. ...