2015-11-06 126 views
8

MySql的透视表我有一个表结构如下:中的Yii CActiveDataProvider

CREATE TABLE IF NOT EXISTS `CustomValue` (
    `id` int(11) NOT NULL, 
    `customFieldId` int(11) NOT NULL, 
    `relatedId` int(11) NOT NULL, 
    `fieldValue` text COLLATE utf8_unicode_ci, 
    `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE IF NOT EXISTS `CustomField` (
    `id` int(11) NOT NULL, 
    `customTypeId` int(11) NOT NULL, 
    `fieldName` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `relatedTable` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `defaultValue` text COLLATE utf8_unicode_ci, 
    `sortOrder` int(11) NOT NULL DEFAULT '0', 
    `enabled` char(1) COLLATE utf8_unicode_ci DEFAULT '1', 
    `listItemTag` char(1) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `required` char(1) COLLATE utf8_unicode_ci DEFAULT '0', 
    `onCreate` char(1) COLLATE utf8_unicode_ci DEFAULT '1', 
    `onEdit` char(1) COLLATE utf8_unicode_ci DEFAULT '1', 
    `onView` char(1) COLLATE utf8_unicode_ci DEFAULT '1', 
    `listValues` text COLLATE utf8_unicode_ci, 
    `label` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `htmlOptions` text COLLATE utf8_unicode_ci 
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 


CREATE TABLE IF NOT EXISTS `User` (
    `id` bigint(20) NOT NULL, 
    `address1` text COLLATE utf8_unicode_ci, 
    `mobile` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `name` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `firstName` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `lastName` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL 
) ENGINE=MyISAM AUTO_INCREMENT=4034 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

请检查SQL小提琴为好。 http://sqlfiddle.com/#!9/1a579/3

该数据已加载此查询。

SET @Colvalues = NULL; 
SET @sql = NULL; 

SELECT 
    GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(f.fieldName = ''', 
     f.fieldName, ''', COALESCE(v.fieldValue, f.defaultValue) , NULL)) AS ', '''', f.fieldName , '''') 
) INTO @Colvalues 
FROM customField AS f 
INNER JOIN Customvalue AS v ON f.Id = v.customFieldId; 


SET @sql = CONCAT('SELECT 
    u.*, v.relatedId, v.CreatedAt, ', @Colvalues , ' 
FROM customField AS f 
INNER JOIN Customvalue AS v ON f.Id = v.customFieldId RIGHT JOIN User u on u.id = v.relatedId 
GROUP BY v.relatedId, v.CreatedAt;'); 

PREPARE stmt 
FROM @sql; 

EXECUTE stmt; 

我怎样才能形成这一个CDbCriteria对象和CActiveDataProvider?我需要将这些数据加载到cgridview,并允许使用cgridview filters搜索自定义列。

目前这是我做了什么:

public function searchPeople($customFields) 
    { 
     $criteria = new CDbCriteria; 
     $criteria->together = true; 

     $criteria->compare('address1', $this->address1, true); 
     $criteria->compare('mobile', $this->mobile, true); 
     $criteria->compare('t.firstName', $this->firstName, true); 
     $criteria->compare('t.lastName', $this->lastName, true); 


     if (!empty($customFields)) { 
      $criteria->join .= ' LEFT OUTER JOIN CustomValue cv ON cv.relatedId=t.id'; 
      //foreach ($customFields as $k => $customField) { 
      //print_r($customField); exit; 
      //} 
     } 

输出的print_r的($的CustomField):

CustomValue Object 
(
    [fieldStyle] => 
    [fieldName] => ALTERNATEEMAIL 
    [fieldLabel] => Alternate Email 
    [fieldType] => text 
    [fieldTag] => 
    [fieldIsRequired] => 1 
    [fieldDefaultValue] => 
    [listValues] => 
    [_new:CActiveRecord:private] => 1 
    [_attributes:CActiveRecord:private] => Array 
     (
      [customFieldId] => 14 
      [fieldValue] => 
     ) 
+0

它可能有助于解释什么是不符合你到目前为止......或者更具体地说明你在实施它的问题 –

+0

@clickstefan这是我的查询。 http://sqlfiddle.com/#!9/1a579/3我需要根据动态列过滤记录。我试图首先将此格式设置为CDbCriteria。 – dev1234

回答

2

你为什么不创建一个SQL视图,然后一个新的模型由此?

SQL不包含动态值,它应该以更紧凑的形式写入。

+0

在MYSQL中不可能创建动态查询的VIEW。 – dev1234