2012-09-03 18 views
8

मैं प्रोपेल 1.6 का उपयोग कर रहा हूं और मुझे यकीन नहीं है कि किसी ऑब्जेक्ट को कैसे प्राप्त करें (इसके "id" विशेषता मान को प्रोपेल ऑब्जेक्ट संग्रह से दिया गया है। मुझे प्रोपेल के दस्तावेज़ीकरण में सीधे जवाब नहीं मिला (PropelCollection methods लागू प्रतीत नहीं होता?)। उदाहरण के लिए: चलें कहते हैं कि मैं निम्नलिखित स्कीमा के साथ एक "व्यक्ति" तालिका है:ऑब्जेक्ट संग्रह से "id" द्वारा ऑब्जेक्ट कैसे प्राप्त करें?

<table name="person"> 
    <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/> 
    <column name="name" type="VARCHAR" size="100" required="true"/> 
</table> 

मैं "व्यक्ति" वस्तुओं का संग्रह प्राप्त करने के लिए निम्न क्वेरी कर: तब

$persons = PersonQuery::create()->find(); 

, मैं किसी दिए गए "आईडी" (उदाहरण के लिए "आईडी = 3" के साथ "व्यक्ति") के साथ "व्यक्ति" ऑब्जेक्ट ढूंढना चाहते हैं, डेटाबेस में नई क्वेरी बिना। मैं यह कैसे कर सकता हूं?

$persons->get(...?)? 

दूसरे शब्दों में, मैं ऐसा नहीं करना चाहता हूँ:

$personX = PersonQuery::create()->findOneById(3); 

प्रसंग:

मैं प्रदर्शन में सुधार करने के लिए एक डेटाबेस क्वेरी बनाने को रोकने के लिए चाहते हैं। , कि बहुत ही कुशल नहीं होगा, लेकिन आप इसे खोजने के लिए संग्रह के माध्यम से जा सकते हैं

foreach ($books as $book) { 
    $book['author_name'] = PersonQuery::create()->findOneById($book['author_id'])->getName(); 
} 

उत्तर

4

खैर: बयान, एक foreach बयान है कि अन्यथा कई डेटाबेस कनेक्शन करने के लिए नेतृत्व करेंगे के अंदर डाला जा करने के लिए निम्नलिखित की तरह है ।

$persons = PersonQuery::create()->find(); 
foreach ($persons as $person) 
{ 
    if (3 == $person->getId()) 
    { 
    break; 
    } 
} 

// now you have your person with id = 3 
var_dump($person->getId()); 
+1

आप 'array_filter के साथ एक और अधिक सुरुचिपूर्ण तरीके से यह कर सकते हैं()' :-) – Florent

+0

@ j0k कर सकते हैं एक foreach पाश से बचने के लिए, लेकिन मुझे लगता है, जैसा कि आप सुझाव देते हैं, मैं इससे बच नहीं सकता। मुझे लगता है कि लूप के साथ जाने से कई डेटाबेस कनेक्शन बनाने से भी अधिक कुशल होगा। आपके उत्तर के लिए धन्यवाद! – RayOnAir

+1

@Florent: मुझे यकीन नहीं है कि इस मामले में [array_filter] (http://php.net/manual/en/function.array-filter.php) फ़ंक्शन को कैसे कार्यान्वित किया जाए, लेकिन मैं जांच करूंगा ... धन्यवाद! – RayOnAir

3

के बाद से प्रोपेल ठीक से परिणाम क्वेरी कैश नहीं है, आप (@ j0k कहा के रूप में) संग्रह पुनरावृति की जरूरत है। foreach लूप का उपयोग करने के बजाय, आप array_filter को बंद करने (PHP 5.3 के साथ) पर कॉल कर सकते हैं।

// Request the persons 
$persons = PersonQuery::create()->find(); 

// Filter the persons whose ID equals 3 
$filteredPersons = array_filter($persons, function ($person) { 
    return 3 === $person->getId(); 
}); 

// Get the first result 
$person = empty($filteredPersons) ? null : $filteredPersons[0]; 

आप यह सुनिश्चित करें कि व्यक्ति मिल जाएगा रहे हैं, तो आप भी (पीएचपी 5.4 के साथ) निम्नलिखित लाइनों लिख सकते हैं:

// Filter the person whose ID equals 3 
$person = array_filter($persons, function ($person) { 
    return 3 === $person->getId(); 
})[0]; 
+0

array_filter का उपयोग करके वैकल्पिक समाधान साझा करने के लिए धन्यवाद! फोरैच लूप का उपयोग करने के मुकाबले यह समाधान एक प्रदर्शन स्टैंड पॉइंट से बेहतर होगा? यदि हां, तो क्या आप अंतर्ज्ञान को पीछे छोड़ सकते हैं? – RayOnAir

+1

PHP 5.4 के साथ, 'foreach'' array_filter() 'से 3x तेज है। इसके अलावा 'foreach' का उपयोग करके आप अपनी प्रविष्टि मिलने पर' ब्रेक 'कर सकते हैं। लेकिन मेरी राय में 'array_filter() 'अधिक _aesthetic_ है। – Florent

+0

मैं इसे ध्यान में रखूंगा। धन्यवाद! – RayOnAir

2

अगर आप सेट प्रोपेल :: isInstancePoolingEnabled() सच है (यह डिफ़ॉल्ट रूप से सच है), तो आप

// Request the persons 
$persons = PersonQuery::create()->find(); 
// get person from pool 
$person = PersonPeer::getInstanceFromPool(3); 

मेरी अंग्रेजी के बारे में खेद है।

1

user2663223 के जवाब देने के लिए प्रोपेल> = 1.5 के साथ वैकल्पिक होगा:

$persons = PersonQuery::create()->find() 

$person = PersonQuery::create()->findPk(3); 

इस उदाहरण पूल का लाभ लेता है। आंतरिक रूप से यह उपयोग करता है: getInstanceFromPool, अगर एसक्यूएल क्वेरी पहले किया गया था।

अधिक जानकारी के लिए, देखें:

http://propelorm.org/documentation/03-basic-crud.html#propel-instance-pool

7

एक अन्य विकल्प है, तो आप कई बार खोज करने के लिए की जरूरत है, खासकर यदि $ के साथ आईडी से ऑब्जेक्ट की श्रेणी प्राप्त करने के लिए है COLLECTION-> getArrayCopy ('ईद')।मैं कोशिश कर रहा था:

$persons = PersonQuery::create()->find(); 
$personsById = $persons->getArrayCopy('Id'); 

तो फिर तुम

$person = $personsById[3]; 

या

if (isset($personsById[3])) { 
    $person = $personsById[3]; 
    ... 
} 
संबंधित मुद्दे