10

ここでCakePHP2.0を使用します。タイトルは少し誤解を招く可能性があるため、わかりやすくするために、ユーザーが商品をカートに追加すると、商品のIDが入力されるセッション配列があります。したがって、この配列は[0] => 25、[1]=>70などのようになります。この配列が$productsと呼ばれるとします。

私が聞きたいのは、'find'モデルの関数('conditions' => array('Product.id' => $ products))を使用して取得した配列を、一部のモデルではなくソートする可能性があることです。 .field値('order'オプションと同様)ですが、$ products配列インデックスによって、製品コンテンツを表示するときに、ユーザーが追加した順序でカート内のすべての製品を並べ替えることができます。

次に例を示します-セッション配列$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 ))

これまでのところ、すべての答えが私の問題を解決するわけではありません。私が与えた例にもっと注意を払ってください、それは非常に単純ですが、提供された答えは異なるキーにあります。

繰り返しになりますが、最終的な配列$listをセッション配列$productsのインデックスで並べ替える必要がありますが、何も指定せず、falseに設定しようとしても、 $listはProduct.idフィールドで並べ替えられます。'find(array('order'=> ...))'

4

6 に答える 6

2

失礼に聞こえたくないのですが、私の質問に対するすべての回答は、製品ID(明らかに私が尋ねたものではありませんでした)で配列を並べ替える方法、または不適切な手動SQLクエリを実行するための提案に関するものでした。必要なものをきちんと説明できなかったようですが、なるべく明確にしようと思いました。ごめんなさい。

ケーキの「注文を無効にする」方法を見つけようとしているときに、解決策に出くわしました。したがって、基本的に必要なのは、カートに追加された製品IDを保持する配列($ queueと呼びます)を用意し、モデル関数の検索(またはページ付け)の「順序」オプションでそれを提供する必要があります。お気に入り:

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

例として、 $queueは次のようになります。

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

最終的に、製品の順序が$queueの場合と同じである$list配列を取得します。'order'を指定しなかった場合は、次のような$list配列を取得します。

 [queue] => Array
            (
                [0] => 1
                [1] => 11
                [2] => 51
            )
于 2012-04-20T16:21:46.227 に答える
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);
于 2012-04-19T14:17:18.067 に答える
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);
于 2012-04-19T14:09:37.877 に答える
0

これは有効なSQLであり、cakephpにレンダリングさせる方法はわかりませんが、注文の問題は解決すると思います。

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

于 2012-04-19T14:11:36.133 に答える
0

私が正しく理解している場合は、モデルの結果を並べ替える必要があります。つまり、クエリに順序を設定して、任意の方法で並べ替える必要があります。

2つのオプションがあります:

  1. 並べ替えを指定します。Cakeに精通していませんが、生成する必要のあるmysqlは次のとおりです:(order by id = 25 desc, id = 70 desc, id = etc推測すると試してみると思います)これは配列order => 'id = 25 desc, id = 70 desc, id = etc'からアセンブルする必要があります。$products

  2. バスケットモデルを作成し、結合クエリを使用して製品リストを正しい順序で取得します(単純ではありませんが、セッション変数に依存するよりもおそらく優れています)。

アップデート

私は注意を払い、Cake構文の推測とともに、生成する必要のあるSQLを提供する問題を修正しました。投稿されたソリューションを見ると、FIELD(id、x、x、x)は同じことをしていますが、はるかにクリーンなソリューションです。それを見つけるためによくやった、しかし、彼らは一般的に少し失礼に見えるので、私はあなたの「失礼であるつもりはない」コメントを削除します。

于 2012-04-19T14:13:34.540 に答える
0

私が通常このような問題を処理する方法は、Cakeに組み込まれているSetクラスを使用して、製品IDで$listにインデックスを付けることです。それで

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

次に、カート($ products)をループして、すでに希望の順序になっているものを使用します

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

お役に立てれば。

于 2012-04-20T02:35:25.840 に答える