찾다

 >  Q&A  >  본문

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;">제목 순위_색인 생성_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;">제목 순위_색인 생성_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粉002023326460일 전448

모든 응답(2)나는 대답할 것이다

  • P粉662802882

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

    저는 거의 확실하게 은용액을 선택하겠습니다

    귀하의 진술:

    말도 안 돼요. 두 결과 세트를 함께 분할/슬라이싱/연결하는 것은 성능에 측정 가능한 영향을 미치지 않을 것입니다. 확실히 "요청이 느려지는" 것은 아닙니다!

    이것은 귀하의 시나리오에 맞는 SQL 솔루션이지만 관련된 테이블의 크기에 따라 두 개의 결과 집합을 함께 연결하는 것보다 속도가 거의 확실히 느립니다.

    으아악

    장난감이 1000개보다 많으면 여기에 설명된 대로 재귀 cte가 기본값 cte_max_recursion_length에 도달합니다.

    위 쿼리 앞에 다음 명령을 실행하여 제한을 제거할 수 있습니다.

    으아악

    또는 toys 테이블에서 "nofollow noreferrer">ROW_NUMBER()를 사용하여 재귀 CTE를 비재귀 CTE로 변경합니다.

    으아악

    이것은 당신이 가지고 놀 수 있는 db<>fiddle입니다.

    회신하다
    0
  • P粉571233520

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

    올해에는 쿼리에서 직접 정렬하는 것이 더 복잡합니다. MySQL 결과 세트는 고정 위치별로 정렬됩니다복잡성을 자세히 이해하고 싶다면 이 질문을 참조하세요.

    이전에 했던 작업은 비교적 간단하고 두 가지 쿼리를 통해 완성되었는데,

    • 첫 번째는 현재 페이징 범위 내에서 고정된 항목을 쿼리하는 것입니다.
    • 두 번째 쿼리는 날짜별로 정렬된 표준 페이징 쿼리입니다.
    • 그런 다음 고정된 항목을 페이지가 매겨진 쿼리에 푸시하고 해당 열 값을 기반으로 인덱스를 사용합니다.

    다음은 참고할 수 있는 예시입니다

    으아악

    회신하다
    0
  • 취소회신하다