Yii-Modell findAll() und count() zurückgeben unterschiedliche Anzahl der Ergebnisse

AKTUALISIERT: siehe Ende der Frage

Arbeite ich mit Yii (und RESTFullYii in allem, aber ich bezweifle, dass ist relevant für die Frage)

Es ist ein CDbCriteria für ein Modell:

        $criteria = new CDbCriteria(
                array(
                        'together' => true,
                        'with' => array(
                            'roles'=> array(
                                'having' => "roles.role IN ($userRoles)"
                                ))
                    )
            );
        $count = $model->count($criteria);
        $result= $model->findAll($criteria);

Während der findAll() Methode gibt nur 3 Datensätze (die ist gut) die count() - Methode gibt zurück, 13 die Gesamtanzahl der Datensätze in der Tabelle vertreten durch die $model

Habe ich aktiviert-query-Protokollierung in MySQL und ich fand heraus, dass die zwei-Abfrage generiert, die von Yii ist komplett anders

SELECT `t`.`id` AS `t0_c0`,
       `t`.`name` AS `t0_c1`,
       `t`.`description` AS `t0_c2`,
       `t`.`enabled` AS `t0_c3`,
       `t`.`issuegroup_id` AS `t0_c4`,
       `t`.`role_id_exec` AS `t0_c5`,
       `t`.`require_attachment` AS `t0_c6`,
       `roles`.`id` AS `t1_c0`,
       `roles`.`role` AS `t1_c1`,
       `roles`.`enabled` AS `t1_c2`,
       `roles`.`description` AS `t1_c3`
FROM `issuetype` `t`
       LEFT OUTER JOIN `role_has_issuetype` `roles_roles` ON
         (`t`.`id`=`roles_roles`.`issuetype_id`)
       LEFT OUTER JOIN `role` `roles` ON
         (`roles`.`id`=`roles_roles`.`role_id`)
HAVING (roles.role IN ('user'))
LIMIT 100

Den anderen-Abfrage:

SELECT COUNT(DISTINCT `t`.`id`)
FROM `issuetype` `t`
LEFT OUTER JOIN `role_has_issuetype` `roles_roles` ON
    (`t`.`id`=`roles_roles`.`issuetype_id`)
LEFT OUTER JOIN `role` `roles` ON
    (`roles`.`id`=`roles_roles`.`role_id`)

Ist dies das normale Verhalten für die findAll() und count() Methoden oder habe ich etwas ich sollte nicht getan haben, oder ist das ein bug in Yii?

Sind und wie man die tatsächliche Anzahl der Datensätze, richtig?

count($model->findAll($criteria)) scheint zu funktionieren gut, aber ist dies die richtige Lösung oder ist es nur ein workaround?

(Aus performance-Sicht ich denke, es könnte besser sein, als der tatsächliche count() denn ich bin läuft die gleiche Abfrage zweimal die-Cache von MySQL-server)

UPDATE:
Ich habe gefragt, die gleiche Frage auf GitHub und Paul Klimov freundlich darauf hingewiesen, dass es nicht notwendig ist für das 'ich' und 'group' - Klauseln werden in der verknüpften Tabelle und es ist vollkommen OK, um es zu bewegen aus dem 'mit' es hier zu sehen: https://github.com/yiisoft/yii/issues/3297

Ich kann nicht sagen, warum die Werte unterschiedlich sind, aber ich benutze count($Ergebnis) die ganze Zeit ohne Problem. Die Nutzung ist vollkommen in Ordnung.
vielen Dank für den input, zumindest weiß ich, ich bin sicher mit dieser Methode 🙂
Das problem mit count($result) ist, dass, wenn Sie Paginierung, dann zählen nur noch die Nummer von nummerierten Einträgen. in deinem Beispiel wird der Zähler maximal 100, da ein Grenzwert angewendet wird, auf die Anfrage.
Basierend auf dem Beispiel-code sind Sie in der Lage zu verwenden, WOBEI anstatt, was ich denke, wäre das problem gelöst. Aber wie andere erwähnt haben, sind Sie wahrscheinlich am besten aus, ein Upgrade auf die neueste version von Yii. Beachten Sie auch, Yii2 ist sehr nah an der beta-Version.

InformationsquelleAutor Andrew | 2014-03-23

Schreibe einen Kommentar