Сортировка поля по нескольким значениям в Laravel - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть массив кодов городов

$cities=[9,12,14,2,3,4,5,6,8,10,11,13]

В моей таблице сообщений есть внешний ключ с именем city_id

Я хочу сортировать сообщения на основе значений этого массива

Таким образом: загружаются первые сообщения города 9, затем сообщения города 12, а затем сообщения города 14 и т. Д.

Я пытался использовать этот метод, но это неверно

$posts->orderByRaw('city_id in ? desc',$cities);

Можете ли вы помочь мне найти лучшее решение?

Ответы [ 4 ]

0 голосов
/ 20 января 2019

Благодаря решению друзей я использовал этот метод, и я думаю, что он менее сложен, чем предлагаемые методы друзей

 $posts=$posts->orderByRaw('FIELD(city_id, '.$cities->implode( ', ').') asc')->orderBy('created_at','desc')->get();
0 голосов
/ 16 декабря 2018

1-й найти все posts, относящиеся к cities, а затем sort по данному заказу, например

$cities = [9,12,14,2,3,4,5,6,8,10,11,13]; // order you'd like to see with posts

$posts = Post::whereIn('city_id', $cities)->sort(function($a, $b) uses ($cities) {
    $pos_a = array_search($a->getAttributes()['city_id'], $cities);
    $pos_b = array_search($b->getAttributes()['city_id'], $cities);
    return $pos_a - $pos_b;
})->get();

// $posts contains the required order with city_ids
0 голосов
/ 16 декабря 2018

Вы можете использовать необработанный запрос с «CASE что THEN index», так как вы указываете запросу видеть что-то в качестве индекса, чтобы вы могли присвоить 0 первому элементу в вашем массиве.

$sql .= "....";

foreach($cities as $index => $city) {
    $sql .= "CASE {$city} THEN {$index}";
}

$sql .= "....";
0 голосов
/ 16 декабря 2018

Единственный способ, которым я могу думать о том, чтобы сделать что-то подобное (по крайней мере, прямо сейчас), это сделать что-то вроде этого

$all_posts = [];
$cities=[9,12,14,2,3,4,5,6,8,10,11,13];

foreach ($cities as city) {
    $city_posts = Post::whereRaw('city_id = ?', $city)->orderByRaw('created_at DESC');
    array_push($all_posts, $city_posts);
}

dd($all_posts);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...