<?php
namespace app\controllers;
use yii\web\Controller;
use app\models\Customer; class CustomerController extends Controller{ //根据顾客名字查询出所有的订单信息
public function actionIndex(){
$customer = Customer::find()->where(['name'=>'zhangsan'])->one();
$orders = $customer->hasMany('app\models\Order',['customer_id'=>'id'])->asArray()->all();
print_r($orders);
}
} ?>

上边的控制器方法查询,Customer模型没有具体方法。

上边的 app\models\Order 可以改进为Order::className(),并且上边要添加use app\models\Order;

方式二:(使用model方法)

customer模型代码:

<?php
namespace app\models;
use yii\db\ActiveRecord;
class Customer extends ActiveRecord{ public function getOrders(){
return $this->hasMany(Order::className(),['customer_id'=>'id'])->asArray()->all();
}
}

控制器代码:

namespace app\controllers;
use yii\web\Controller;
use app\models\Customer; class CustomerController extends Controller{ //根据顾客名字查询出所有的订单信息
public function actionIndex(){
$customer = Customer::find()->where(['name'=>'zhangsan'])->one();
$orders = $customer->getOrders();
print_r($orders);
}
}

方法三:(调用模型的属性查询)

customer模型代码:

namespace app\models;
use yii\db\ActiveRecord;
class Customer extends ActiveRecord{ public function getOrders(){
return $this->hasMany(Order::className(),['customer_id'=>'id'])->asArray();
}
}

控制器代码:

namespace app\controllers;
use yii\web\Controller;
use app\models\Customer; class CustomerController extends Controller{ //根据顾客名字查询出所有的订单信息
public function actionIndex(){
$customer = Customer::find()->where(['name'=>'zhangsan'])->one();
$orders = $customer->orders;
//说明,当调用一个不存在的属性时,
//php会去调用一个__get()的方法,
//__get()的方法会自动调用一个get+属性的方法,即getOrders()
//并且会再查询时自动补上->all()或->one()方法,根据模型查询的hasMany或hasOne决定的
print_r($orders);
}
}

根据订单id获取对应的顾客信息:

模型代码:

namespace app\models;
use yii\db\ActiveRecord;
class Order extends ActiveRecord{ //根据订单id获取顾客信息
public function getCustomer(){
return $this->hasOne(Customer::className(),['id'=>'customer_id'])->asArray();
} }

控制器代码:

namespace app\controllers;
use yii\web\Controller;
use app\models\Order; class CustomerController extends Controller{ //根据订单查询用户信息
public function actionIndex(){
$orders = Order::find()->where(['id'=>2])->one();
$customer = $orders->customer;
print_r($customer);
}
}
以上代码中的$orders->customer会记录缓存,如果要删除缓存,可以使用unset($orders->customer)。
关联查询的多次查询
$customers = Customer::find()->all();
foreach($customers as $customer){
$orders = $customer->orders;
}
这样如果有100条数据,就总共需要查询101次。
优化:
$customers = Customer::find()->with('orders')->all();
foreach($customers as $customer){
$orders = $customer->orders;
}
总共查询两次。
												

yii 之数据库关联查询的更多相关文章

  1. Yii2实现跨mysql数据库关联查询排序功能

    遇到一个项目,需要跨表网上找了很多的资料,整理一下,方便以后再次使用 背景:在一个mysql服务器上(注意:两个数据库必须在同一个mysql服务器上)有两个数据库: memory (存储常规数据表) ...

  2. MySQL查询(关联查询)

    一.mysql查询与权限 (一)数据库关联查询 **内连接查询(inner join)** 查询两个表共有的数据,交集 SELECT * FROM tb1 INNER JOIN tb2 ON 条件 所 ...

  3. 如何玩转跨库Join?跨数据库实例查询应用实践

    背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...

  4. Mybatis关联查询和数据库不一致问题分析与解决

    Mybatis关联查询和数据库不一致问题分析与解决 本文的前提是,确定sql语句没有问题,确定在数据库中使用sql和项目中结果不一致. 在使用SpringMVC+Mybatis做多表关联时候,发现也不 ...

  5. Oracle 数据库(oracle Database)Select 多表关联查询方式

    Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...

  6. YII关联查询

    原文链接:http://keshion.iteye.com/blog/1607994 一.多表关联的配置 在我们使用 AR 执行关联查询之前,我们需要让 AR 知道一个 AR 类是怎样关联到另一个的. ...

  7. [Oracle] 关系型数据库排序算法和数据结构以及关联查询

    关系型数据库排序算法和数据结构以及关联查询 1. Merge sort 理解merge sort算法将有助于更好地理解数据库join操作 - merge join 算法逻辑 将2个有序的大小为N/2的 ...

  8. Yii关联查询(转载)

    原文链接:http://keshion.iteye.com/blog/1607994 一.多表关联的配置 在我们使用 AR 执行关联查询之前,我们需要让 AR 知道一个 AR 类是怎样关联到另一个的. ...

  9. day95:flask:SQLAlchemy数据库查询进阶&关联查询

    目录 1.数据库查询-进阶 1.常用的SQLAlchemy查询过滤器 2.常用的SQLAlchemy查询结果的方法 3.filter 4.order_by 5.count 6.limit&of ...

随机推荐

  1. ftp - Internet 文件传输程序 (file transfer program)

    概述 (SYNOPSIS) ftp [-pinegvd ] [host ] pftp [-inegvd ] [host ] 说明 (DESCRIPTION) 用户通过 Ftp 这个程序来使用 Inte ...

  2. Mac app 破解之路

    6年之前一直做过一些内存挂,脚本挂.都是比较低级的技术. 这几年期间,断断续续利用业余时间学了一些汇编的知识,当时只是想着破解游戏. 所有的黑技术都是业余自学的,没有老师可以问,只能百度和自己领悟,比 ...

  3. 工程化---cnpm不是内部命令的解决

    (1)问题描述 安装完,执行cnpm -v发现报出不是内部命令. 安装成功如下图: (2)解决方案: 之前配置过默认安装都会在D:\\nodejs\node_global中,所有我们cd 到 这个路径 ...

  4. ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

    部署docker下的mysql时出现以下报错 [root@docker ~]# mysql -h192.168.30.22 -uroot -p Enter password: 出现报错: ERROR ...

  5. win10文件共享的实现

    1)启动网络发现 打开网络共享中心->更改高级共享设置->修改如下 2)如果需要其他客户端无密码访问        修改如下: 3)如果打算使用Guest访问  用户帐户->管理帐户 ...

  6. ubuntu frp 自编译。本文不能按顺序来 请自己理解

    go run:go run 编译并直接运行程序,它会产生一个临时文件(但不会生成 .exe 文件),直接在命令行输出程序执行结果,方便用户调试. go build:go build 用于测试编译包,主 ...

  7. 在Phonegap下实现oAuth认证

    原文:http://www.kuqin.com/mobile/20120719/322873.html 前段时间做过两次关于Phonegap的现场交流会议分享.基本上把Phonegap的一些特性和大家 ...

  8. javascipt的forEach

    1.Array let arr = [1, 2, 3]; arr.forEach(function (element, index, array) { console.log('数组中每个元素:', ...

  9. 洛谷 P2370 P2370 yyy2015c01的U盘

    https://www.luogu.org/problemnew/show/P2370 二分+背包 #include <algorithm> #include <iostream&g ...

  10. Git学习之路

    目录 git安装 linux windows git命令 创建版本库 提交文件 仓库状态 版本回退 工作区和暂存区 工作区 暂存区 推送.下拉和克隆 推送 下拉 克隆 git应该可以说是程序员必备技能 ...