2012-04-19 40 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']; 

希望这有助于。