Burada herhangi bir ek sorguları olmadan bu çözmek için yaptım:
Problem
Symfony Çağrı cihazı ile kullanılan tipik bir sonuç kümesiyle özel COUNT alanı eklemek gerekiyordu. Bildiğimiz gibi Ancak, uskur kutusunu bunu desteklemiyor. Yani kolay bir çözüm sadece şablonda böyle bir şey yapmak için:
foreach ($pager->getResults() as $project):
echo $project->getName() . ' and ' . $project->getNumMembers()
endforeach;
getNumMembers()
her $project
nesne için ayrı bir COUNT sorguyu çalıştırır nerede. Tabii ki, biz size gösterilen her sonuç için bir sorgu tasarruf, orijinal SELECT sorgusu için bir sütun olarak ekleyerek anında SAYISININ yapabilirim çünkü bu ağır verimsiz olduğunu biliyorum.
Ben bu sonuç kümesi, tüm kullanarak farklı Kriterlerine gösteren birçok farklı sayfaları vardı. Ben onun içinde ne dayalı bir sorgu dizesi oluşturmak için çalışırken etrafında Kriterleri nesne ve karmaşa içine almak zorundayız şekilde PDO ile kendi SQL sorgu dizesini yazarken doğrudan yol çok fazla güçlük olurdu!
Peki, ben sonunda yaptım Kriterleri itmek yerli kod işini icar, bütün bu engeller ve her zamanki gibi SQL oluşturun.
1 - Öncelikle [/ set olsun] NumMembers (doSelect tarafından () dönen alır modeli nesne) eşdeğer accessor / mutator yöntemleri oluşturmak. Erişimci artık COUNT sorgu yapmaz, Unutmayın, sadece kendi değerini tutar.
2 - Akran sınıfa gidin ve ana doSelect () yöntemini geçersiz kılar ve tam olduğu gibi ondan tüm kodu kopyalayın
3 - getMixerPreSelectHook baz eş özel bir yöntemdir, çünkü bu biraz kaldırın (veya ihtiyacınız eğer eş içine kopyalayın):
// symfony_behaviors behavior
foreach (sfMixer::getCallables(self::getMixerPreSelectHook(__FUNCTION__)) as $sf_hook)
{
call_user_func($sf_hook, 'BaseTsProjectPeer', $criteria, $con);
}
4 - Şimdi akran sınıfında doSelect yönteme özel COUNT alanı ekleyebilirsiniz:
// copied into ProjectPeer - overrides BaseProjectPeer::doSelectJoinUser()
public static function doSelectJoinUser(Criteria $criteria, ...)
{
// copied from parent method, along with everything else
ProjectPeer::addSelectColumns($criteria);
$startcol = (ProjectPeer::NUM_COLUMNS - ProjectPeer::NUM_LAZY_LOAD_COLUMNS);
UserPeer::addSelectColumns($criteria);
// now add our custom COUNT column after all other columns have been added
// so as to not screw up Propel's position matching system when hydrating
// the Project and User objects.
$criteria->addSelectColumn('COUNT(' . ProjectMemberPeer::ID . ')');
// now add the GROUP BY clause to count members by project
$criteria->addGroupByColumn(self::ID);
// more parent code
...
// until we get to this bit inside the hydrating loop:
$obj1 = new $cls();
$obj1->hydrate($row);
// AND...hydrate our custom COUNT property (the last column)
$obj1->setNumMembers($row[count($row) - 1]);
// more code copied from parent
...
return $results;
}
İşte bu. Şimdi ek COUNT alanı, sonuçlarını tükürmek olarak almak için ayrı bir sorgu yapmadan nesne ekledi. Bu çözüm tek dezavantajı doğru bunun ortasında bit eklemek gerekir çünkü tüm üst kodu kopyalayın yaşadım olmasıdır. Ama benim durumda, bu tüm bu sorguları kaydetmek ve kendi SQL sorgu dizesini yazmak değil, küçük bir uzlaşma gibi görünüyordu.