zoukankan      html  css  js  c++  java
  • yii 之数据库关联查询

    <?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;
    }
    总共查询两次。


  • 相关阅读:
    JSON介绍
    json例子(后台取消息)
    在Struts 2中使用JSON Ajax支持
    JSON介绍
    json例子(后台取消息)
    64位播放器播放RMVB时一卡一顿
    标记一个:HookQQ QQFun CWUB
    Android开发环境搭建全程演示(jdk+eclip+android sdk)
    64位播放器播放RMVB时一卡一顿
    一种可做特殊用途的字符串匹配算法
  • 原文地址:https://www.cnblogs.com/gyfluck/p/9104295.html
Copyright © 2011-2022 走看看