加入收藏 | 设为首页 | 会员中心 | 我要投稿 平顶山站长网 (https://www.0375zz.cn/)- 分布式云、数据处理、媒体处理、图像分析、基础存储!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

yii2数据库关联查询有哪些方法?

发布时间:2022-03-12 13:53:31 所属栏目:语言 来源:互联网
导读:这篇文章主要给大家分享yii2框架数据库关联查询的操作,对大家学习yii2框架具有一定的借鉴价值,感兴趣的朋友可以参考一下,希望大家阅读完这篇文章能有所收获,下面我们一起来学习一下吧。 ?php namespace appcontrollers; use yiiwebController; use ap
      这篇文章主要给大家分享yii2框架数据库关联查询的操作,对大家学习yii2框架具有一定的借鉴价值,感兴趣的朋友可以参考一下,希望大家阅读完这篇文章能有所收获,下面我们一起来学习一下吧。
 
<?php
namespace appcontrollers;
use yiiwebController;
use appmodelsCustomer;
class CustomerController extends Controller{
  //根据顾客名字查询出所有的订单信息
  public function actionIndex(){
    $customer = Customer::find()->where(['name'=>'zhangsan'])->one();
    $orders = $customer->hasMany('appmodelsOrder',['customer_id'=>'id'])->asArray()->all();
    print_r($orders);
  }
}
?>
 
    上边的控制器方法查询,Customer模型没有具体方法。
 
    上边的 appmodelsOrder 可以改进为Order::className(),并且上边要添加use appmodelsOrder;
 
    方式二:(使用model方法)
 
    customer模型代码:
 
<?php
namespace appmodels;
use yiidbActiveRecord;
class Customer extends ActiveRecord{
  public function getOrders(){
    return $this->hasMany(Order::className(),['customer_id'=>'id'])->asArray()->all();
  }
}
 
    控制器代码:
 
namespace appcontrollers;
use yiiwebController;
use appmodelsCustomer;
class CustomerController extends Controller{
  //根据顾客名字查询出所有的订单信息
  public function actionIndex(){
    $customer = Customer::find()->where(['name'=>'zhangsan'])->one();
    $orders = $customer->getOrders();
    print_r($orders);
  }
}
 
    方法三:(调用模型的属性查询)
 
    customer模型代码:
 
namespace appmodels;
use yiidbActiveRecord;
class Customer extends ActiveRecord{
  public function getOrders(){
    return $this->hasMany(Order::className(),['customer_id'=>'id'])->asArray();
  }
}
 
    控制器代码:
 
namespace appcontrollers;
use yiiwebController;
use appmodelsCustomer;
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 appmodels;
use yiidbActiveRecord;
class Order extends ActiveRecord{
  //根据订单id获取顾客信息
  public function getCustomer(){
    return $this->hasOne(Customer::className(),['id'=>'customer_id'])->asArray();
  }
}
 
    控制器代码:
 
namespace appcontrollers;
use yiiwebController;
use appmodelsOrder;
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;
}
 

(编辑:平顶山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读