programing

라라벨: 어디에 있는지 순서

magicmemo 2023. 8. 19. 10:06
반응형

라라벨: 어디에 있는지 순서

일부 콘텐츠를 쿼리하기 위해 스핑크스 검색을 사용하고 있으며 MySQL로 쿼리할 개체의 ID를 가지고 있습니다.스핑크스가 주는 순위에 따라 내 아이디 배열이 정렬됩니다.따라서 다음과 같은 MySQL을 만들고 싶습니다.

SELECT * FROM table WHERE id IN (1,17,2) 
ORDER BY FIELD(id,1,17,2)

제가 할 수 있다는 것을 압니다.

Table::whereIn('id', $ids)->get();

하지만 제가 주문한 것을 받을 수 없습니다.

어떻게 하면 라라벨과 함께 제대로 할 수 있을까요?

솔루션:

$ids = array(1,17,2);
 
$ids_ordered = implode(',', $ids);
 
$items = static::whereIn('id', $ids)
 ->orderByRaw("FIELD(id, $ids_ordered)")
 ->get();

추가 참고 사항:

WHERE IN 절에 있는 ID의 현재 순서에 따라 모든 항목을 한 번에 주문하기라는 제목의 기사에 있는 솔루션을 사용하여 다음과 같이 설명합니다.

WHERE IN 절에서 제공한 배열의 ID 순서를 사용하여 데이터베이스에서 항목을 정렬할 때 유용합니다.사용할 다른 ID 순서를 제공하는 등 사용자의 요구에 맞게 쉽게 수정할 수 있습니다.

// Raw SQL:
// SELECT * FROM items WHERE id IN (1,2,3,4,5) ORDER BY FIELD(id,1,2,3,4,5);
 
$itemIds = array(1,2,3,4,5);
 
$ids = implode(',', $itemIds);
 
$items = static::whereIn('id', $itemIds)
    ->orderByRaw(DB::raw("FIELD(id, $ids)"))
    ->take($limit)
    ->get();

저도 이 문제가 있었지만, 제 목표 배열 요소는 문자열이었습니다.이 경우에는...

$strings = array('xxx','yyy','zzz');

$imploded_strings = implode("','", $strings);

$items = static::whereIn('some_column', $strings)
->orderByRaw(DB::raw("FIELD(some_column, '$imploded_strings')"))
->get();
$category_id = Category::select('id')->orderby('name','ASC')->get()->pluck('id')->toArray();

언급URL : https://stackoverflow.com/questions/26704575/laravel-order-by-where-in

반응형