यहाँ क्या मैं किसी भी अतिरिक्त प्रश्नों के बिना इस को हल करने के लिए किया था है:
समस्या
एक विशिष्ट परिणाम Symfony पेजर के साथ प्रयोग किया सेट करने के लिए कस्टम COUNT क्षेत्र को जोड़ने के लिए की आवश्यकता। हालांकि, जैसा कि हम जानते हैं, प्रोपेल इस बॉक्स का समर्थन नहीं करता है। तो आसान समाधान सिर्फ टेम्पलेट में कुछ इस तरह करना है:
foreach ($pager->getResults() as $project):
echo $project->getName() . ' and ' . $project->getNumMembers()
endforeach;
कहाँ getNumMembers()
प्रत्येक $project
वस्तु के लिए एक अलग COUNT क्वेरी चलाता है। बेशक, हम जानते हैं कि यह काफी अक्षम है क्योंकि आप मूल चयन क्वेरी में कॉलम के रूप में इसे जोड़कर फ्लाई पर COUNT कर सकते हैं, प्रत्येक परिणाम प्रदर्शित करने के लिए एक क्वेरी सहेज सकते हैं।
मेरे पास इस परिणाम सेट को प्रदर्शित करने वाले कई अलग-अलग पृष्ठ थे, सभी अलग मानदंडों का उपयोग करते हुए। तो पीडीओ के साथ अपनी खुद की एसक्यूएल क्वेरी स्ट्रिंग को सीधे लिखना बहुत मुश्किल होगा क्योंकि मुझे इसमें जो कुछ भी था, उसके आधार पर क्वेरी स्ट्रिंग बनाने की कोशिश करने के आसपास मुझे मानदंड वस्तु और गड़बड़ में जाना होगा!
तो, मैंने अंत में जो किया वह सब से बचाता है, प्रोपेल के देशी कोड को मानदंड के साथ काम करने और सामान्य रूप से एसक्यूएल बनाने की अनुमति देता है।
1 - पहले मॉडल ऑब्जेक्ट में [get/set] न्यूममेम्बर() समकक्ष एक्सेसर/म्यूटेटर विधियों को बनाएं जो DoSelect() द्वारा लौट रहे हैं। याद रखें, एक्सेसर अब COUNT क्वेरी नहीं करता है, यह केवल उसका मान रखता है।
2 - सहकर्मी वर्ग में जाकर माता-पिता doSelect() विधि ओवरराइड और इसे से सभी कोड को कॉपी बिल्कुल के रूप में यह
3 - इस बिट निकालें क्योंकि getMixerPreSelectHook आधार सहकर्मी के लिए एक निजी तरीका है (या अपने सहकर्मी में कॉपी यदि आपको आवश्यकता):
// symfony_behaviors behavior
foreach (sfMixer::getCallables(self::getMixerPreSelectHook(__FUNCTION__)) as $sf_hook)
{
call_user_func($sf_hook, 'BaseTsProjectPeer', $criteria, $con);
}
4 - अब आप अपने साथियों के वर्ग में doSelect विधि करने के लिए अपने कस्टम COUNT क्षेत्र जोड़ें:
// 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;
}
यह है कि। अब आपके पास परिणाम को थूकने के लिए अलग-अलग क्वेरी करने के बिना आपके ऑब्जेक्ट में अतिरिक्त COUNT फ़ील्ड जोड़ा गया है। इस समाधान में एकमात्र कमी यह है कि आपको सभी मूल कोड कॉपी करना होगा क्योंकि आपको इसके बीच में बिट्स जोड़ने की आवश्यकता है। लेकिन मेरी स्थिति में, यह उन सभी प्रश्नों को सहेजने के लिए एक छोटी समझौता की तरह लग रहा था और अपनी खुद की एसक्यूएल क्वेरी स्ट्रिंग नहीं लिख रहा था।
उस उत्तर के लिए धन्यवाद - इससे मुझे एक अलग समस्या हल करने में मदद मिली है! –