2015-11-06 13 views
8

Ho una struttura di tabella come segue:tabella pivot MySql per 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; 

Si prega di controllare il violino SQL pure. http://sqlfiddle.com/#!9/1a579/3

I dati vengono caricati con questa query.

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; 

Come faccio a formare questo a un oggetto CDbCriteria e CActiveDataProvider? Devo caricare questi dati in un cgridview e consentire la ricerca di colonne personalizzate con cgridview filters.

Attualmente questo è quello che ho fatto:

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; 
      //} 
     } 

uscita di 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

potrebbe aiutare a spiegare cosa non funziona con quello che hai finora ... O essere più specifico sul problema che hai nell'implementarlo –

+0

@clickstefan questa è la mia query. http://sqlfiddle.com/#!9/1a579/3 Ho bisogno di filtrare i record basati su colonne dinamiche. sto provando a configurare prima questo formato su un CDbCriteria. – dev1234

risposta

2

Perché non creare una Visualizzazione SQL e quindi un nuovo modello da questa?

L'SQL non contiene valori dinamici, dovrebbe essere scritto in forma più compatta.

+0

la creazione di una VISTA per le query dinamiche non è possibile in MYSQL. – dev1234