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


  • 相关阅读:
    调试cuda程序一定要细心啊 不然一个bug会折腾你2天
    XML和实体类之间相互转换(序列化和反序列化)
    C#实现实体类和XML相互转换
    C#压缩打包文件例子
    通过锁字符串达到控制并发的效果C#
    巧用Ajax的beforeSend 提高用户体验
    HTML代码在线运行工具
    .NET使用ZXing.NET生成中间带图片和不带图片的二维码
    获取电脑硬件信息 (硬盘,cpu,内存等)
    C# http请求带请求头部分
  • 原文地址:https://www.cnblogs.com/gyfluck/p/9104295.html
Copyright © 2020-2023  润新知