Nasıl Symfony'de uskur ORM kullanarak yan tümcesi ile grup ile bir SQL sayım yazabilirim?

3 Cevap php

Nasıl uskur ORM kullanarak aşağıdaki SQL sorgu yazabilirsiniz?

SELECT species, COUNT(*) FROM Bird GROUP BY species;

3 Cevap

Bu, sadece species sütun ve bu türlerin sayısını seçin yana, anlamlı hidratlı Bird nesnelerin neden olacak bir sorgu değildir. Yani a "raw" SQL query as Colin suggested, muhtemelen en iyi yolu, buraya gitmek istiyorum - ama sadece elde edilen PDOStatement den veri almak, sonunda hidrat yok.

species bir Species tabloya bir referans olsaydı, oradan işe yarayabilir: hidrat Species nesneler, türlerin başına kuş sayımları için ekstra bir kolonu ile. Eğer sürüm 1.2 kadar Symfony kullanırsanız büyük ölçüde Criteria ile çalışan basitleştiren ve bir tek ek sütunu seçmek için yöntemleri vardır, ben çok, DbFinder plugin öneriyor:

$speciesQuery = DbFinder::from('Species')->
  join('Bird')->
  groupBy('Bird.Id')->
  withColumn('COUNT(Bird.Id)', 'NbBirds');

foreach ($speciesQuery->find() as $species) {
  echo $species->getName() . ": " . $species->getNbBirds() . " birds\n";
}

Eğer Symfony 1.3 veya 1.4 kullanıyorsanız, François Zaniotto, DbFinder yaratıcısı, çok işlevselliğini taşıdık ve daha fazla katma 1,5, uskur için birlikte Propel 1.4 yükseltmesi gerektiğini, bu nedenle yukarıdaki kod ekstra bir eklenti olmadan uskur 1.5 çalışır.

$c = new Criteria();
$c->addAsColumn('cnt', "count(*)");
self::addSelectColumns($c);
$c->addGroupByColumn(BirdPeer::SPECIES);

Eğer kalabalık nesnelere sayısı (*) almak gerekiyor ama eğer yo özel nemlendirici yapmak gerekir.

Ben (üzerinde bir API belgesi orada görünmüyor) zor uskur Kriterleri tek bir belgeyi bulmak için bulduk bu yüzden genellikle symfony kitabın Bölüm 8'de listesini kullanmak; ama ben bu kapsamlı olsun ya da olmasın hiçbir fikrim yok.

Ama ne yapabilirim uskur doğrudan SQL beslemektir. Aşağıda, bir örnek modifiye edilir http://propel.phpdb.org/docs/user_guide/chapters/FindingObjects.html,

    $con = Propel::getConnection(DATABASE_NAME);

    // if not using a driver that supports sub-selects
    // you must do a cross join (left join w/ NULL)
    $sql = "SELECT species, COUNT(*) FROM Bird GROUP BY species";

    $stmt = $con->createStatement();
    $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_NUM);

    return parent::populateObjects($rs);

Ben olabilir ama ben şimdiye kadar bu yolu kendim kullandım sanmıyorum.