0

Cakephp 3 でソーシャル アプリケーションを開発しています。

私は今、メッセージ機能に取り組んでいます。このように機能し、左側にユーザ​​ーが表示され、会話をしているユーザーが表示され、真ん中に会話が表示されます。

ユーザーを最後のメッセージの日付で並べ替えたい。つまり、私が最後に書いたのが Peter だった場合、Peter が一番上に表示されるはずです。

次のクエリがあります。

$query = $this->Messages
    ->find('all', [
        'fields' => [
            'MAX(`messages`.`max_date`)',
            'id',
            'sender_id',
            'reciever_id',
        ]
    ])
    ->where([
        'sender_id = ' => $active_user_id
    ])
    ->orWhere([
        'reciever_id = ' => $active_user_id
    ])
    ->group([
        'sender_id',
        'reciever_id'
    ])
    ->order([
        'id' => 'DESC'
    ]);

パフォーマンス上の理由から、sender_id と reciever_id によるグループ化を追加しました。すべてのメッセージを受信するのではなく、これまでに書いたユーザーだけを見つけたいからです。

問題は、グループステートメントがソートを破壊することです。そこで、順序を維持するために max-aggregate-function を考えました。

ただし、cakephp フレームワークによって次のエラー メッセージが表示されます。

エラー: SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルで、1 行目の「MAX(`messages`__`max_date`), Messages.id AS `Messages__id`, Messages.sender_id A' の近くで使用する正しい構文を確認してください。

誰でも知っていますか、私のクエリの何が問題なのですか? ドキュメントの例に従うために最善を尽くしました。

なぜ__ではなくmessages__max_dateと言うのですかmessagesmax_date?

4

1 に答える 1

0

これは、計算フィールドと対応するエイリアスを定義する方法ではありません。これは、次のような方法で行う必要がありますkey => value

'fields' => [
    'max_date' => 'MAX(`Messages`.`date_time`)',
    // ...
]

次のようなSQLフラグメントになります

MAX(`Messages`.`date_time`) AS `max_date`

クックブック > データベース アクセスと ORM > クエリ ビルダー > データの選択を参照してください。

また、ヒントとして、必要に応じて CakePHP がプラットフォーム固有の SQL を適切に作成できるように、単純な文字列の代わりに式を使用することをお勧めします。MAXAFAIR には影響しないため、これは単なる一般的なヒントです。

$query = $this->Messages->find();
$query
    ->select([
        'max_date' => $query->func()->max($this->Messages->aliasField('date_time'))
        // ...
    ])
    // ...

クックブック > データベース アクセスと ORM > クエリ ビルダー > SQL 関数の使用を参照してください。

于 2016-01-11T12:18:27.647 に答える