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


  • 相关阅读:
    alert()、confirm()和prompt()的区别与用法
    简单的算法
    图片消失隐藏轮播
    HTML head 头标签
    关于for of循环的用法和使用
    requestanimationframe用法一二
    关于css中after和before伪类的用法
    HTML5使用local storage存储的数据是如何保存在本地的
    js中  关于bom的知识
    关于一些假值的问题
  • 原文地址:https://www.cnblogs.com/gyfluck/p/9104295.html
Copyright © 2020-2023  润新知