Pregunta

Tengo dos tablas:

Participante y Votos Concursante hasMany Votos

He intentado hacer un recuento (Vote.id) como votos para que pueda colocarlo en el de registros y simplemente paginate ellos, pero no tengo idea de dónde colocarlo. Lo hice en la matriz de campos, pero me dio el recuento total de votos independientemente de que el concursante al que pertenecen.

Los votos están unidos entre sí en el conjunto de registros concursante así que lo que hicimos fue en mi opinión lo hice un recuento ($ concursante [Votar]), pero esto no se puede paginado y mi cliente quiere ser capaz de ordenar los concursantes por votos.

¿Hay alguna manera de hacer algo como esto en mi punto de vista:?

tipo ( 'votos', 'count (Voto)'); ?>

O tengo que crear una consulta que hace un recuento de todos los votos donde Contestant.id = Votes.contestant_id?

Controlador Participante:

function index() {
            $page = 'Contestants';
            $this->set('page', $page);
            $this->paginate =
            array(
                    'order' => 'id ASC',
                    'contain' => array(
                            'Vote' => array(
                                    'fields' => array("Vote.contestant_id",'Vote.id')
                            )
                    )
            $conditions ["Contestant.active"] = 1;
            $this->set('contestants', $this->paginate('Contestant',

$ condiciones));         }

¿Fue útil?

Solución 2

Desde CakePHP no soporta el grupo en el comportamiento controlable por lo intentó un enfoque diferente. Crear el var paginate para el modelo de voto en su lugar (Todo esto se realiza en el controlador de concursantes):

var $paginate = array(
    'Vote'=>array(
        'limit'=>5,
        'fields' => array(
        'Contestant.*, count(Vote.contestant_id) as Contestant_votes, Vote.id'
        ),
        'group' => array(
        'Vote.contestant_id'
        ),
        'order' => array(
        'Contestant_votes Desc'
        )
    ),
    'Contestant'=>array(
        'limit'=>5,
        'order' => array(
        'Contestant.id Desc'
        )
    )
);

Y ahora en mi controlador hago lo siguiente:

function index() {
    $page = 'Contestants';
    $this->set('page', $page);  
    $conditions ["Contestant.active"] = 1;
    $this->set('contestants', $this->paginate($this->Contestant->Vote,$conditions));
}

Ahora los concursantes se ordenan según su recuento total de votos, aunque todavía no puedo cifra cómo colocar los Contestant_votes como una variable paginador ya que en el conjunto de registros está en una gran variedad de su propia y no en ninguna de las matrices de modelo utilizado para paginas.

Gracias Matt Huggins su enfoque fue la que me llevó a esta solución.

Otros consejos

Salida respuesta de deceze en esta pregunta:? CakePHP-matemático de cálculo

En esencia que quiere hacer algo como esto supongo:

'contain' => array(
    'Vote' => array(
        'fields' => array('SUM(Vote.id) AS Contestant__votes'),
        'group'  => array('Vote.contestant_id'),
    )
)

Además: ¿Usted también desea ordenar por votos (el total de votos) ascendente o descendente? Si es así, no se puede hacer fácilmente por el método de la paginación por defecto de CakePHP.

Para eso se necesita un pequeño arreglo. Aquí están los detalles acerca de este truco: CakePHP avanzada paginación - ordenar por campo derivado

La esperanza que lo encontraría útil.

Gracias Adnan

En la relación específica que defina, sus necesidades están bien servido por counter-caching .

Usted tendrá que definir un nuevo campo en la tabla contestants: vote_count. Luego, en su modelo de Votos, tendrá que actualizar la definición $belongsTo ligeramente:

class Votes extends AppModel
{
    var $belongsTo = array(
        'Contestant' => array( 'counterCache' => true )
    );
}

Ahora, cada vez que un registro de voto se guarda, se actualizará el campo vote_count del padre concursante. Ahora usted puede simplemente ordenar por Contestant.vote_count como lo haría con cualquier otro campo concursante:

class ContestantsController extends AppController
{
    // Controller stuff that comes before...

    function index()
    {
        $this->paginate = array( 'Contestant' => array(
            'conditions' => array( 'Contestant.active' => 1 ),
            'order' => array( 'Contestant.vote_count' => 'DESC' ),
        ));

        $contestants = $this->paginate('Contestants');

        $this->set( compact('contestants'));
    }

    // Controller stuff that comes after...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top