2012-04-19 8 views
10

यहां केकेपीएचपी 2.0 का उपयोग करना। शीर्षक थोड़ा भ्रामक है, इसलिए चीजों को साफ़ करने के लिए - मेरे पास सत्र सरणी है जो उत्पादों के आईडी के साथ आबादी है क्योंकि उपयोगकर्ता उन्हें कार्ट में जोड़ता है। तो यह सरणी [0] => 25, [1] => 70 आदि की तरह जाती है मान लें कि इस सरणी को $ उत्पादों कहा जाता है।इसके प्रारंभिक अवस्था को संरक्षित करने के लिए सरणी को कैसे क्रमबद्ध करें

मैं जो पूछना चाहता हूं वह है कि मुझे 'खोज' मॉडल के फ़ंक्शन ('स्थितियां' => सरणी ('product.id' => $ उत्पादों) का उपयोग करके प्राप्त होने वाली सरणी रखने की कुछ संभावना है। Model.field मानों में से कुछ (जैसे 'ऑर्डर' विकल्प में), लेकिन $ उत्पादों सरणी इंडेक्स द्वारा, ताकि जब मैं उत्पादों की सामग्री को प्रस्तुत करता हूं तो मुझे उन सभी उत्पादों को कार्ट में क्रमबद्ध किया जाएगा जैसे उपयोगकर्ता उन्हें जोड़ रहे थे ।

यहाँ एक उदाहरण है - सत्र सरणी $ उत्पादों:

[0] => 35, 
[1] => 15, 
[2] => 25 

तो मैं खोज समारोह की शर्तों को यह सरणी पारित:

$list = $this->Product->find('all', array('conditions' => array('Product.id' => $products))); 

अंत $ सूची में मुझे सरणी जो के अनुसार क्रमबद्ध देता है उत्पाद आइ डि। तो होने के बजाय:

[0] => Array 
    (
     [Product] => Array 
      (
       [id] => 35)), 
[1] => Array 
     (
      [Product] => Array 
       (
        [id] => 15)), 

[2] => Array 
     (
      [Product] => Array 
       (
        [id] => 25)) 

मैं:

[0] => Array 
    (
     [Product] => Array 
      (
       [id] => 15)), 
[1] => Array 
     (
      [Product] => Array 
       (
        [id] => 25)), 
[2] => Array 
     (
      [Product] => Array 
       (
        [id] => 35)) 

अब तक सभी जवाब मेरी समस्या का समाधान नहीं है। कृपया, मैंने जो उदाहरण दिया है, उस पर ध्यान दें, यह बहुत आसान है, लेकिन प्रदान किए गए उत्तरों अलग-अलग कुंजी में हैं।

फिर से, मैं अंतिम सरणी $ सूची की आवश्यकता सत्र सरणी $ उत्पादों के सूचकांकों के अनुसार क्रमबद्ध किया जाना है, लेकिन मैं $ सूची Product.id क्षेत्र के अनुसार क्रमबद्ध मिलता है, भले ही मैं किसी भी 'find(array('order'=> ...))' निर्दिष्ट नहीं किया है बिल्कुल भी और इसे झूठी पर सेट करने की कोशिश की।

+3

सवाल नहीं समझ सकता, लेकिन मैं इस मदद मिल सकती है लगता है ... आप अपनी आरंभिक अवस्था संरक्षण एक सरणी क्रमबद्ध नहीं कर सकते (क्योंकि यह आपको ऑर्डर कर रहा है), लेकिन आप इसे दो बार स्टोर कर सकते हैं या इससे भी बेहतर आप सरणी के इंडेक्स को अपने शुरुआती राज्य में स्टोर कर सकते हैं, ताकि आप जब भी चाहें सरणी को अपने शुरुआती राज्य (या वाइसवर्सा) में ऑर्डर कर सकें। $itial_state_indexes = array_keys ($ the_array); –

+0

सहमत हैं, प्रश्न थोड़ा अस्पष्ट है ... कोड के साथ अपने बिंदु को स्पष्ट करने का प्रयास करें या किसी भिन्न कोण से – mseancole

+0

पर आ रहा है, मैं बिल्कुल 'ऑर्डर' का उपयोग नहीं कर रहा हूं।जैसा कि मैंने कहा, सत्र सरणी उत्पादों में उत्पादों के आईडी शामिल हैं जिनमें सूचकांक ([0] और इसी तरह से) उपयोगकर्ता द्वारा जोड़े गए उत्पादों के अनुक्रम का प्रतिनिधित्व करते हैं। –

उत्तर

2

अशिष्ट ध्वनि करने के लिए नहीं करना चाहते, लेकिन मेरे सवाल के लिए प्रतिक्रियाओं के सभी कैसे मैनुअल एसक्यूएल प्रश्नों जो अनुचित है कर रही पर उत्पाद आईडी के आधार पर अपने सरणी (जो स्पष्ट रूप से नहीं था कि मैं क्या पूछा) या सुझाव ऑर्डर करने के लिए के बारे में थे। ऐसा लगता है कि मैं जिस चीज की ज़रूरत थी उसका उचित वर्णन नहीं कर सका, लेकिन मैंने इसे यथासंभव स्पष्ट करने की कोशिश की, क्षमा करें।

केक में 'ऑर्डर अक्षम' करने का तरीका खोजने के दौरान मैंने समाधान पर ठोकर खाई। तो मूल रूप से आपको जो करना है वह एक सरणी है (चलिए इसे $ कतार पर कॉल करें) जहां आप उत्पाद आईडी को कार्ट में जोड़े जाते हैं, और उसके बाद मॉडल फ़ंक्शन (या पेजिनेट) में 'ऑर्डर' विकल्प में आपको चाहिए प्रदान इसे पसंद:

'order'=>array('FIELD(Product.id,'.implode(',', $queue).')') 

$ कतार ऐसा दिख सकता है, उदाहरण के रूप में:

[queue] => Array 
     (
      [0] => 51 
      [1] => 1 
      [2] => 11 
     ) 

अंत में आप $ सूची सरणी मिल जिसमें उत्पादों के क्रम में रूप में ही है $ कतार। आप 'ऑर्डर' निर्दिष्ट नहीं किया है, तो आप आप इस तरह सरणी $ सूची प्राप्त होगा:

[queue] => Array 
      (
       [0] => 1 
       [1] => 11 
       [2] => 51 
      ) 
0

मैं एक साधारण SQL क्वेरी के बारे में नहीं सोच सकता जो परिणामों को पैरामीटर की सूची के अनुसार आदेश देगा।

तो सबसे आसान संभव है कि उन्हें डीबी से प्राप्त करने के बाद रिकॉर्ड्स को फिर से व्यवस्थित किया जाए।

$records = $this->Product->find('all', array('conditions' => array('Product.id' => $products))); 

$sorted_records = array(); 
foreach($records as $record) 
{ 
    $key = array_search($record['Product']['id'], $products); 
    $sorted_records[$key] = $record; 
} 

ksort($sorted_records); 

debug($sorted_records); 
0

यह वह जगह है वैध एसक्यूएल, यकीन नहीं कैसे CakePHP यह प्रस्तुत करना लेकिन मुझे लगता है कि यह आपके आदेश मुद्दे का समाधान होगा बनाने के लिए:

SELECT * FROM product WHERE id IN (35, 15, 25) ORDER BY id = 35 DESC, id = 15 DESC, id = 25

0

अगर मैं सही ढंग से समझ आप मॉडल परिणाम ऑर्डर करने के लिए की जरूरत है , या दूसरे शब्दों में एक मनमानी फैशन में क्रमबद्ध करने के लिए क्वेरी पर एक ऑर्डर सेट करें।

  1. एक प्रकार का उल्लेख करें:

    यहाँ दो विकल्प है। केक से परिचित नहीं है लेकिन माइस्क्ल को उत्पन्न करने की आवश्यकता है: order by id = 25 desc, id = 70 desc, id = etc (अनुमान है कि order => 'id = 25 desc, id = 70 desc, id = etc' को आजमाएं) जो आपको $products सरणी से इकट्ठा करना होगा।

  2. एक टोकरी मॉडल बनाएं और उत्पाद सूची को सही क्रम में प्राप्त करने के लिए एक जॉइन क्वेरी का उपयोग करें (सरल नहीं बल्कि संभवतः सत्र var पर निर्भर होने से बेहतर)।

अद्यतन

मैं ध्यान दिया था और आपकी समस्या का समाधान किया एसक्यूएल आप उत्पन्न करने के लिए, केक वाक्य रचना में के अनुमान के साथ की जरूरत के साथ आप प्रदान करते हैं। अपने पोस्ट किए गए समाधान को देखते हुए, आपका FIELD (आईडी, एक्स, एक्स, एक्स) एक ही काम कर रहा है, लेकिन यह एक बहुत साफ समाधान है। इसे खोजने के लिए अच्छी तरह से किया गया, मैं आपकी "कठोर होने का मतलब नहीं है" टिप्पणियां हटा दूंगा, क्योंकि वे आम तौर पर छोटे कठोर लगते हैं।

0

मैं केक या इसकी डेटाबेस परतों से परिचित नहीं हूं, लेकिन शायद आप थोड़ा सा एसक्यूएल जोड़ सकते हैं। जैसे

order by field(myTable.myID, 35, 15, 25) 
-- or alternatively, more cross database compatible 
order by case when myTable.myID = 35 then 1 
       when myTable.myID = 15 then 2 
       when myTable.myID = 25 then 3 
     end 

कुछ

प्रासंगिक एसक्यूएल होगा हालांकि, सबसे सार्वभौमिक दृष्टिकोण सिर्फ php कोड में पुन: व्यवस्थित करने के लिए किया जाएगा।

$products = array(35,15,25);//the ordered array 
$records = array_flip($products); 
foreach ($list as $row) { 
    $id = $row['Product']['id']; 
    $records[$id] = $row; 
} 
print_r($records); 
0

तरह से मैं आम तौर पर इस तरह की समस्याओं को संभालने के सेट वर्ग है, जो केक में बनाया गया है का उपयोग कर उत्पाद आईडी के आधार पर $ सूची का अनुक्रमण कर रहा है। तो

$list = Set::combine($list, '{n}.Product.id', '{n}.Product'); 

फिर अपने गाड़ी ($ उत्पादों), जो क्रम में पहले से ही है के माध्यम से लूप का उपयोग आप चाहते हैं

foreach($products as $prod) echo $list[$prod]['Product']['name']; 

आशा इस मदद करता है।

संबंधित मुद्दे