5

注文されたアイテムのリストがあり、intフィールドに従って注文されていますorder。私はCakePHP1.2で、前へと次へのボタンがあるギャラリーを作成しています。これらは、の順序ではなく、順序に従って前のアイテムと次のアイテムにリンクする必要がありますid

この結果を得るために、find関数に'order'パラメーターを含め、それに値を設定しました'Item.order'=>'DESC'。それでも結果はid順序付きリストです。

私の質問は:私は何を間違えるのですか?私のコントローラー:

$this->Item->id = 16;

$neighbours = $this->Item->find('neighbors', array(
    'order' => array('Item.order'=>'DESC'),
    'fields' => array('id','name')
));

私の解決策

私は別のアプローチを試しました。私のコードは今や仕事をしていて、次のように見えます:

$order = $this->Item->findById(6);

$neighbours = $this->Item->find('neighbors', array(
    'field' => 'order',
    'value' => $order['Item']['order']
));

パラメータ'field'をフィールドに設定すると、注文フィールドになり、'value'パラメータを現在のアイテムの注文値に設定すると、prevとが表示されますnext

4

2 に答える 2

4

ええ、問題は、fields配列にorderフィールドが含まれていないことでした。

$neighbours = $this->Item->find('neighbors', array(
    'order' => 'order DESC',
    'fields' => array('id', 'name', 'order')
));

競合するフィールド名を持つ関連モデルがない限り、モデルプレフィックスを含める必要はありません(ただし、通常はこのようなエラーを回避するために行います)。 「フィールド」Item.に含めていれば、元の構文で機能します。[Item.]order

最後に、ソリューションは最適ではありません。必要のないときに2つのSQLクエリを作成しています。そして、「フィールド」は、私が知る限り、クエリオプションではありません。これは、実際には、テーブル内のすべてのフィールドを返すことを意味します。

于 2011-07-20T08:05:58.843 に答える
0

私はこれに問題を抱えていました。基本的に、ユーザーセッションごとにランダムに(1回だけ)並べ替える必要がある質問のリストがあります。

モデルの順序を次のように設定していました。

'FIELD(TestQuestion.id, 3, 1, 5)';

これは通常のクエリでは問題なく機能しましたが、Model.phpの2897行目でネイバーの検索が妨げられています。

$query['order'] = $field . ' DESC';

それで、それを回避するために、私は次のことをしました:

  • 'examination_order'という仮想フィールドを追加し、順序を次のように設定します。

    $this->TestQuestion->virtualFields['examination_order'] = 'FIELD(TestQuestion.id, 3, 1, 5)';
    
    $this->TestQuestion->order = array(
        $this->TestQuestion->alias . '.examination_order'
    );
    
  • find neighbors呼び出しで、「field」を「examination_order」に設定し、値を前に見つけたようにインデックスに設定します。

    $neighbors = $this->TestQuestion->find(
        'neighbors',
        array(
            'field' => 'examination_order',
            'value' => $testQuestion[$this->TestQuestion->alias]['examination_order'],
            'conditions' => $conditions
        )
    );
    
于 2013-11-18T02:51:04.563 に答える