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


  • 相关阅读:
    抽象函数
    函数的奇偶性习题
    高斯函数的那些事
    分段函数
    二次函数习题
    图是学习高中数学的生命线
    恒成立能成立恰成立习题
    http和https的作用与区别
    vue使用v-if v-show页面闪烁,div闪现的解决方法
    理解prototype、proto和constructor的三角关系
  • 原文地址:https://www.cnblogs.com/gyfluck/p/9104295.html
Copyright © 2011-2022 走看看