ホームページ  >  に質問  >  本文

Laravel Eloquentは日付順に並べ替え、ランク付けされたインデックス別にエントリも保存します

<p>Laravel を使用してプロジェクトを構築しており、すべての製品を含むテーブルがあります。このテーブルでは、製品が毎日追加され、ページ上のすべての製品が <code>created_at</code> で並べ替えられて表示されます。これは、Laravel Eloquent と <code>->orderBy('created_at', 'DESC')</code> を使用して簡単に行うことができます。 </p> <p>ただし、特定の製品を特定の場所に「固定」/「固定」できるようにしたいと考えています。これを行うために、返されるクエリ コレクション内で製品に必要な番号を含む <code>rank_index</code> 列を作成しました。 </p> <p>これは私の現在のテーブルです:</p> <pre class="brush:php;toolbar:false;">title Rank_index created_at 素晴らしい製品 2023-01-01 10:04:00 別の製品 4 2023-01-01 10:00:00 ベビーカー 2023-01-01 10:05:00 グリーンカーペット2 2023-01-01 10:08:00 おもちゃ 2023-01-01 10:07:00</pre> <p>次の表は、クエリで返したいコレクションを示しています。</p> <pre class="brush:php;toolbar:false;">title Rank_index created_at おもちゃ 2023-01-01 10:07:00 グリーンカーペット2 2023-01-01 10:08:00 ベビーカー 2023-01-01 10:05:00 別の製品 4 2023-01-01 10:00:00 素晴らしい製品 2023-01-01 10:04:00</pre> <p>そのようなテーブルをデータベースから直接返す解決策があればいいのですが。こうすることで、コレクションを分割してスライスする必要がなくなり、リクエストが大幅に遅くなります。それ以外の場合は、PHP 関数を使用してコレクションを再配置、分割、スライスする必要があります。 </p> <p>何かお役に立てれば幸いです。 </p> <p>よろしくお願いします</p>
P粉002023326P粉002023326438日前438

全員に返信(2)返信します

  • P粉662802882

    P粉6628028822023-08-31 13:18:44

    私はほぼ確実に Silver のソリューションを選択します

    あなたの声明:

    ### 意味がありません。 2 つの結果セットを分割/スライス/結合しても、パフォーマンスに測定可能な影響を与える可能性はほとんどありません。

    「リクエストが遅くなる」ということは決してありません!

    これはあなたのシナリオに適した SQL ソリューションですが、関係するテーブルのサイズによっては、2 つの結果セットを結合するよりもほぼ確実に遅くなります。

    リーリー

    ここで説明されているように、

    1000 を超えるおもちゃがある場合、再帰的 cte はデフォルト値 cte_max_recursion_ Depth に達します。 上記のクエリの前に次のコマンドを実行すると、制限を削除できます:

    リーリー

    または、

    toys

    テーブルの「nofollow noreferrer">ROW_NUMBER() を使用して、再帰的 CTE を非再帰的 CTE に変更します。 リーリー これは再生可能な

    db

    fiddle です。 <>

    返事
    0
  • P粉571233520

    P粉5712335202023-08-31 00:35:47

    今年この問題に遭遇しました。クエリ内で直接並べ替えるのはより複雑です。MySQL の結果セットは固定位置で並べ替えられます複雑さを詳しく理解したい場合は、この質問を参照してください。

    以前に行ったことは比較的単純で、2 つのクエリで完了しました。

    • 最初の方法は、現在のページング範囲内の固定アイテムをクエリすることです。
    • 2 番目のクエリは、日付で並べ替えられた標準のページング クエリです。
    • 次に、固定項目をページ分割されたクエリにプッシュし、その列の値に基づいてインデックスを使用します。

    これは参考になる例です

    リーリー

    返事
    0
  • キャンセル返事