sql >> Database teknologi >  >> RDS >> Mysql

GROUP og COUNT() aldre i CakePHP

De resultater, du får, er stort set de bedste, som CakePHP producerer.

For at forenkle dette bør du bruge Set::combine som genindekserer dit array.

Du skal kalde $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');

Dette ville returnere en matrix med alder som indeks og tælle som værdien:

Array
(
    [9] => Array
        (
            [COUNT(id)] => 1

        )

    [10] => Array
        (
            [COUNT(id)] => 1

        )
    ...
)

Grunden til den ekstra dybde i arrayet er, at cake bruger modellen som nøglen til det indre array, hvis du ikke bruger beregnede felter, så du kan indsætte flere modeller som felter, og de vil blive opdelt i forskellige arrays. Når du bruger beregnede felter, beholder den den samme struktur, men kender ikke modellen, så den skal placeres i et generelt array.

Så lad os sige, at du også vil gruppere efter mand/kvinde, og du har et User.sex-felt, som ikke er et beregnet felt.

$data = $this->User->find('all', array(
    'fields' => array(
        "User.sex"
        "DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(User.dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(User.dob, '00-%m-%d')) AS age",
        'COUNT(User.id) AS [count]' // n.b. you have to give aliases normally
    ),
    'group' => 'age', 'User.sex'
));

Dette ville returnere (noget i stil med):

Array
(
    [0] => Array
        (
            [User] => Array
                (
                    [sex] => Male
                )
            [0] => Array
                (
                    [age] => 4
                    [count] => 1
                )

        )

    [1] => Array
        (
            [User] => Array
                (
                    [sex] => Female
                )
            [0] => Array
                (
                    [age] => 10
                    [count] => 1
                )

        )

    [2] => Array
        (
            [User] => Array
                (
                    [sex] => Male
                )
            [0] => Array
                (
                    [age] => 10
                    [count] => 1
                )

        )
)

Derfor er den ekstra dybde der altid, selvom du kun bruger beregnede felter



  1. Søgning og filtrering / forfining af databaseresultater i Laravel 4

  2. Sikkerhedskopier MySQL Amazon RDS

  3. Hvordan opretter man indeks på JSON-feltet i Postgres?

  4. Transactionscope-undtagelse denne platform understøtter ikke distribuerede transaktioner, mens forbindelsesobjekt åbnes