Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 连接三个表的查询yii_Php_Mysql_Yii - Fatal编程技术网

Php 连接三个表的查询yii

Php 连接三个表的查询yii,php,mysql,yii,Php,Mysql,Yii,如何将mysql查询转换为yii 我有三张桌子 用户头 顾客 客户评级 这是我的sql查询 SELECT t.email FROM otz_user_header t JOIN otz_customers r ON t.user_id = r.customer_user_id JOIN otz_customer_ratings cr ON cr.customer_user_id = r.customer_user_id

如何将mysql查询转换为yii

我有三张桌子

  • 用户头
  • 顾客
  • 客户评级
  • 这是我的sql查询

    SELECT t.email 
    FROM   otz_user_header t 
           JOIN otz_customers r 
             ON t.user_id = r.customer_user_id 
           JOIN otz_customer_ratings cr 
             ON cr.customer_user_id = r.customer_user_id 
    WHERE  r.rate_auto_approve = 0 
           AND r.rate_email_time IS NOT NULL 
           AND r.total_rating_count IS NOT NULL 
           AND cr.rating_date < Curdate() 
           AND cr.rating_date > Date_sub(Curdate(), INTERVAL 7 day) 
    
    选择t.email
    来自otz_用户_标题t
    加入otz_客户r
    在t.user\u id=r.customer\u user\u id上
    加入otz_客户_评级cr
    在cr.customer\u user\u id=r.customer\u user\u id上
    其中r.rate\u auto\u approve=0
    并且r.rate\u email\u time不为空
    并且r.total_rating_count不为空
    和cr.rating_datedate_sub(Curdate(),间隔7天)
    
    如何将此查询转换为yii

    提前感谢。

    使用DAO(数据访问对象)

    型号


    公共功能测试(){
    $sql=“选择t.email
    来自otz_用户_标题t
    在t.user\u id=r.customer\u user\u id上加入otz\u客户r
    加入otz_customer_ratings cr ON cr.customer_user_id=r.customer_user_id
    其中r.rate\u auto\u approve=0
    并且r.rate\u email\u time不为空
    并且r.total_rating_count不为空
    和cr.rating_datedate_SUB(CURDATE(),间隔7
    "天";;
    返回Yii::app()->db->createCommand($sql)->queryAll();
    }
    
    “itachi”的答案是正确的,但如果您正在以activerecord的方式查找

    型号:UserHeader

    关系:

    'activeCustomers' => array(
         self::HAS_MANY, 
         'Customer', 
         'customer_user_id', 
         'condition' => 'activeCustomers.rate_auto_approve=0 
                      AND activeCustomers.rate_email_time IS NOT NULL 
                      AND activeCustomers.total_rating_count IS NOT NULL'
    ),
    
    型号:客户

    关系:

    'lastWeekRatings' => array(
         self::HAS_MANY, 
         'CustomerRating', 
         'customer_user_id', 
         'condition' => 'lastWeekRatings.rating_date < CURDATE() 
            AND lastWeekRatings.rating_date > DATE_SUB( CURDATE(), INTERVAL 7 DAY )'
    ),
    

    您可以直接在Yii中运行mysql语句。但是如果你想使用活动记录的方法,你可以咨询Yii的文档。有一个问题我不明白。对于具有多个连接的复杂查询,活动记录在任何基准测试中都比DAO慢。即使是yiis指南也提到了这一点。就我很久以前所做的,我总是发现它慢了一秒钟。但人们仍然选择活动记录。。。。我是不是遗漏了什么?甚至查询生成器也比AR快。如何使用foreach语句访问这些数据?@ElsonSolano,findAll()始终返回数组(或arrayaccess对象)。您可以循环使用foreach($useremails as$userHeader),并可以访问“$userHeader->email”字段和关系“$userHeader->activeCustomers”这是客户记录列表,而“$userHeader->activeCustomers->lastWeekRatings”这是CustomerRating对象列表。
    'lastWeekRatings' => array(
         self::HAS_MANY, 
         'CustomerRating', 
         'customer_user_id', 
         'condition' => 'lastWeekRatings.rating_date < CURDATE() 
            AND lastWeekRatings.rating_date > DATE_SUB( CURDATE(), INTERVAL 7 DAY )'
    ),
    
    $useremails = UserHeader::model()
         ->with('activeCustomers', 'activeCustomers.lastWeekRatings')
         ->findAll(array(
               'select' => 't.email'
          ));
    print_r($useremails);