2012-04-19 41 views
10

在這裏使用CakePHP 2.0。標題有點誤導,所以爲了清除事情 - 我有會議陣列,用用戶將它們添加到購物車時填入產品ID。所以這個數組類似於[0] => 25,[1] => 70等等。假設這個數組被稱爲$ products。如何對保存初始狀態的數組進行排序

我想問的是有沒有一些可能性,我可以通過使用'查找'模型的功能('條件'=>數組('Product.id'=> $ products)通過一些Model.field值(如'order'選項),但是通過$ products數組索引,這樣當我在視圖中渲染產品內容時,我將按照用戶添加它們的順序將所有這些產品放入購物車中。

下面是一個例子 - 會議數組$產品:

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

然後,我通過這個數組查找功能的條件:

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

最終$名單給我陣列的排序條件爲product.id。因此,而不是具有:

[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

無法理解的問題,但我想這可能會幫助...你不能數組排序保持其初始狀態(因爲你訂購了它),但是你可以存儲它兩次甚至更好,你可以存儲數組的索引到它的初始狀態,這樣你就可以按照你初始狀態(或反之亦然)的順序來定購數組。 $ initial_state_indexes = array_keys($ the_array); – 2012-04-19 13:37:07

+0

同意,問題有點含糊......嘗試用代碼說明您的觀點或從不同的角度來看 – mseancole 2012-04-19 13:44:32

+0

我沒有使用'訂單'。正如我所說的,會話數組$ product包含產品的id,其中索引(來自[0]等等)表示用戶添加的產品序列。 – 2012-04-19 13:47:42

回答

2

不想聽起來粗魯無禮,但對我的問題的所有迴應都是關於如何通過產品ID(顯然不是我問的)排序我的數組或者對使用手動SQL查詢不合適的建議。似乎我無法正確描述我需要的東西,但我試圖儘可能清楚地說明,對不起。

我偶然發現了一個解決方案,同時試圖找到如何「禁用訂單」的蛋糕。所以基本上你需要做的就是創建一個數組(我們稱之爲$ queue),在產品ID添加到購物車時保留產品ID,然後在查找模型函數(或分頁)中按順序選項提供它喜歡:

'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查詢,它會根據參數列表對結果進行排序。

所以最簡單的方法可能是在從db中獲取記錄後重新排序記錄。

$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

這是有效的SQL,不知道如何讓CakePHP的渲染,但我認爲這將解決您的訂購問題:

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

0

如果我理解正確的話,你需要訂購模型結果或者換言之,在查詢上設置一個順序以任意方式進行排序。

這裏有兩種選擇:

  1. 指定排序。不熟悉Cake,但你需要生成的mysql是:order by id = 25 desc, id = 70 desc, id = etc(猜測會嘗試order => 'id = 25 desc, id = 70 desc, id = etc'),你必須從$products數組中組裝。

  2. 創建籃子模型並使用連接查詢以正確順序獲得產品列表(不簡單但可能比依賴會話變種更好)。

更新

我已注意到並沒有解決您的問題向您提供您需要產生,與在蛋糕語法猜測沿着SQL。看看你發佈的解決方案,你的FIELD(id,x,x,x)是做同樣的事情,但是是一個更乾淨的解決方案。幹得好找到它,我會刪除你的「不要粗魯」的意見,但他們通常看起來像粗魯。

0

我不熟悉蛋糕或其數據庫層,但也許你可以添加一點點的SQL。

相關的SQL會是這樣的

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

我平時處理這種問題的方法是使用Set類,它內置蛋糕產品ID索引列表$。所以

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

然後通過你的購物車($產品),這是已經在使用順序循環,你想

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

希望這有助於。