0

私はOrderモデルを持っています。これは、フィールドuser_idによってUserモデルにログインします。ここで、ユーザーごとに1つの最も古い注文を取得したいと思います。例えば:

id = 0, user_id = 1, created = 2012-10-10 20:36:42
id = 1, user_id = 1, created = 2012-10-10 19:36:42
id = 2, user_id = 1, created = 2012-10-10 21:36:42

id = 3, user_id = 2, created = 2012-10-10 22:36:42
id = 4, user_id = 2, created = 2012-10-10 21:36:42
id = 5, user_id = 2, created = 2012-10-10 23:36:42

したがって、結果は次のようになります。

id = 1, user_id = 1, created = 2012-10-10 19:36:42
id = 4, user_id = 2, created = 2012-10-10 21:36:42

私は今のところ次の検索オプションを使用しています:

array(
    'group' => 'user_id',
    'order' => array('MIN(created) DESC'),
)

そしてまた試してみました'order' => array('created DESC')

しかし、それは機能しません-GROUPING注文は常にORDERINGの前に行われるようです。グループ化する前に、findメソッドに作成されたフィールドごとにレコードを並べ替えるように強制するにはどうすればよいですか?

4

3 に答える 3

1

CakePHP のContainable Behaviorを使用します。

//User model
public $actsAs = array('Containable');

public function oldestOrderPerUser() {
    $this->recursive = -1;

    $this->find('all', array(
        'contain' => array(
            'Order' => array(
                'order' => array('created asc'),
                'limit' => 1
            )
        )
    ));
}

これにより、すべてのユーザーが検索されます (「条件」を自由に追加して特定のユーザーに制限し、各ユーザーの最初/古い順序を取得します。

返されるデータは次のようになります。

0 => array(
    'User' => array(
        'id' => 1,
        'name' => 'John Doe',
        'email' => 'johndoe@awesome.com',
        'Order' => array(
            0 => array(
                'id' => '4',
                'user_id' => 1,
                'created' => '2012-10-10 19:36:42'
            )
        )
    )
1 => array(
    'User' => array(
        ...

各ユーザーと注文で返されるフィールドを制限したり、どちらか/両方に条件を設定したり、どちらか/両方を制限したりできます...など.

AppModel をデフォルトとして設定することをお勧め$this->recursive=-1;します。そうすると、各クエリの前や各モデルで指定する必要がなくなります。とにかく -1 以外のものを使用するのは悪い習慣なので、うまくいきます。

public $actsAs = array('Containable');AppModelにも設定しました。

于 2012-10-18T14:13:01.793 に答える
1

HAVING句を使用して、グループをフィルタリングできます。CakePHP でクエリを作成するには、句に句を含める必要がありますORDER

$this->Order->find('all', array(
  'group' => 'user_id HAVING created = MIN(created)',
  'order' => array('created DESC')
));
于 2012-10-18T14:04:01.813 に答える
0

今はテストできませんが、この方法を試してください:

$this->Order->find('all', array(
  'fields' => array('MIN(Order.Created) as min_created'),
  'group' => 'user_id',
  'order' => array('min_created DESC')
));
于 2012-10-18T09:39:18.543 に答える