Cgridview E Conteggio In Relation N - 1

Finalmente ho la situazione opposta

CausalType 1 -> N Causal

Nell’admin view di causaltype, che usa una cgridview, devo visualizzare il numero di causali associate a quel tipo.

Ho impostato nel model di CausalType la relation:




return array(

		        "causals" => array (self::HAS_MANY, "Causal", "causalTypeId"  ), 

		);



ho aggiunto una variabile di classe per l’alias della colonna




  public $activeCausalCount; // Usato per la colonna col conteggio delle causali attive



ed ho definto così la colonna nella view admin




 array (

	          'name' => 'activeCausalCount',

	          'value' => 'count($data->causals)',    

	    ), 



Attualmente vedo correttamente il numero di causali associate

Problema 1

  • Come effettuo l’ordinamento ?

Problema 2

  • Come faccio a fare il count delle causali con stato isActive=1

Questo serve perchè non sarà permesso disabilitare i tipi di causale che hanno causali attive agganciate.

PROBLEMA 2 RISOLTO — PROBLEMA 1 NO !

Ecco la soluzione del problema 2

admin view




 array ( 

	            'name'=> 'activeCausalCount',

	            'value' => 'Causal::model()->getActiveCountByType($data->id)',

	    ),



Causal model




public function getActiveCountByType($typeId) {

	    $value = $this->count('isActive=1 and causalTypeId=:typeId', array(':typeId'=>$typeId));

	    return $value;

	}



Puoi provare mettendo la ‘order’ direttamente nel metodo search del model che vuoi ordinare.

Aggiungere un ordinamento e’ una cosa molto noiosa.

Per fare in modo che l’header diventi attivo devi modificare la proprieta’ Dataprovider->Sort->attributes, devi mettere TUTTI i campi.

Imposta l’ordinamento su SUM(isActive) ASC/DESC e metti la tabella con isActive in with.

non ho ben capito, ma immagino intendi di aggiungere al dataprovider le istruzioni per fare il sort su quel campo, come dice zaccaria, giusto ?

@zaccaria, il fatto è che non devo fare la conta degli isActive del model casualtype, ma delle causal con active=1 che appartengono a quella causalType.

Ora provo, ho già modificato a mano tanti altri ordinamenti sin ora, anche su campi in relazione 1-N su due livelli, per cui noioso sarà, ma se è da fare è da fare…

Se devi fare la conta degli active dovresti fare:


SELECT count(*)

WHERE isActive=1

GROUP BY model_id

Ma siccome tanto quelle active hanno 1 e quelle non active hanno 0, possiamo risparmiarci la where e fare:


SELECT sum(isActive)

WHERE isActive=1

GROUP BY model_id

Quel sum potresti anche selezionarlo ed ottenerlo come proprieta’ del model principale, un questa maniera non devi fare una query aggiuntiva per ogni record, tanto se fai il sort ti tocchera’ fare anche il filtering, per cui tanto vale farlo stiloso sin da subito.