在这里使用CakePHP 2.0。标题有点误导,所以为了清理 - 我有会话数组,当用户将它们添加到购物车时,其中填充了产品的ID。所以这个数组就像[0] => 25,[1] => 70等等。假设这个数组叫做$ products。
我想问的是,是否有可能通过使用'find'模型的函数('conditions'=> array('Product.id'=> $ products))来获得数组不是通过一些Model.field值(如'order'选项),而是通过$ products数组索引,这样当我在视图中呈现产品内容时,我会将购物车中的所有产品按照用户添加的顺序排序他们。
这是一个例子 - 会话数组$产品:
[0] => 35,
[1] => 15,
[2] => 25
然后我将这个数组传递给find函数的条件:
$list = $this->Product->find('all', array('conditions' => array('Product.id' => $products)));
最后$ list给出了按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 ))
到目前为止,所有答案都没有解决我的问题。请密切注意我给出的例子,这很简单,但提供的答案是不同的关键。
同样,我需要按照会话数组 $ products 的索引对最终数组 $ list 进行排序,但我得到 $ list 排序依据Product.id字段,即使我根本没有指定任何'find(array('order'=> ...))'
,甚至尝试将其设置为false。
答案 0 :(得分:2)
不想听起来很粗鲁,但是对我的问题的所有回答都是关于如何按产品ID(显然不是我要求的)订购我的数组,或者建议进行不合适的手动SQL查询。好像我无法正确描述我需要的东西,但我尽量让它尽可能清楚,抱歉。
我偶然发现了一个解决方案,试图找到如何在蛋糕中“禁用订单”。所以基本上你需要做的就是有一个数组(让我们称之为 $ queue ),你将产品ID添加到购物车中,然后在查找模型功能中的“顺序”选项中保留产品ID(或者paginate)你应该提供它:
'order'=>array('FIELD(Product.id,'.implode(',', $queue).')')
$ queue 可能如下所示,例如:
[queue] => Array
(
[0] => 51
[1] => 1
[2] => 11
)
最后,您会获得 $ list 数组,其中产品的订单与 $ queue 中的相同。如果你没有指定'order'那么你会得到 $ list 这样的数组:
[queue] => Array
(
[0] => 1
[1] => 11
[2] => 51
)
答案 1 :(得分: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);
答案 2 :(得分:0)
这是有效的SQL,不知道如何让cakephp渲染它,但我认为它将解决您的订购问题:
SELECT * FROM product WHERE id IN (35, 15, 25) ORDER BY id = 35 DESC, id = 15 DESC, id = 25
答案 3 :(得分:0)
如果我理解正确,您需要订购模型结果,或者换句话说,在查询上设置一个顺序以便以任意方式排序。
以下是两个选项:
指定排序。不熟悉Cake但你需要生成的mysql是:order by id = 25 desc, id = 70 desc, id = etc
(猜测会尝试order => 'id = 25 desc, id = 70 desc, id = etc'
)你必须从$products
数组中组装。
创建一个购物篮模型并使用连接查询以正确的顺序获取产品列表(不是简单但可能比依赖会话变量更好)。
<强>更新强>
我已经注意并修复了您的问题,为您提供了生成所需的SQL,以及对Cake语法的猜测。查看您发布的解决方案,您的FIELD(id,x,x,x)正在做同样的事情,但是更清洁的解决方案。为找到它做得好,我会删除你的“不要故意粗鲁”的评论,因为他们通常看起来似乎是小粗鲁。
答案 4 :(得分: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);
答案 5 :(得分:0)
我通常处理这类问题的方法是使用内置于Cake中的Set类通过Product ID索引$ list。所以
$list = Set::combine($list, '{n}.Product.id', '{n}.Product');
然后在购物车中使用循环($ products),这已经按照您想要的顺序
foreach($products as $prod) echo $list[$prod]['Product']['name'];
希望这有帮助。