Order By before Group By Eloquent принадлежит отношение ToMany - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу, чтобы уникальные посты упорядочивались по project_id, в основном, если есть дублированные посты, я хочу тот, который project_id не равен нулю. Есть ли способ получить это?

Этот код возвращает уникальные сообщения, но они не упорядочены по project_id.

/**
 * Get the posts record associated with the service.
 */
public function posts()
{
    return $this->belongsToMany('App\Post')
        ->withPivot('id', 'unity', 'coefficient', 'project_id')
        ->orderBy('project_id', 'DESC')
        ->groupBy(['post_id']);
}

Если я удалю groupBy, я получу дублирующиеся сообщения, заказанные по project_id.

Выход dd($service->posts()->toSql());:

select * from `posts` 
inner join `post_service` on `posts`.`id` = `post_service`.`post_id` 
where `post_service`.`service_id` = ? 
group by `post_id` 
order by `project_id` desc

Ниже я показываю полученные результаты и желаемый результат:

Я удалил дополнительные данные для лучшего чтения

Результат с предложениями groupBy и orderBy. Уникальные сообщения, но не заказанные project_id:

"posts": [
    {
        "id": 733,
        "pivot": {
            "service_id": 20177,
            "post_id": 733,
            "id": 2575,
            "project_id": null
        }
    },
    {
        "id": 725,
        "pivot": {
            "service_id": 20177,
            "post_id": 725,
            "id": 2576,
            "project_id": null
        }
    }
],

Результат без предложения groupBy. Дублированные сообщения, упорядоченные по project_id:

"posts": [
    {
        "id": 733,
        "pivot": {
            "service_id": 20177,
            "post_id": 733,
            "id": 9723,
            "project_id": 4
        }
    },
    {
        "id": 733,
        "pivot": {
            "service_id": 20177,
            "post_id": 733,
            "id": 2575,
            "project_id": null
        }
    },
    {
        "id": 725,
        "pivot": {
            "service_id": 20177,
            "post_id": 725,
            "id": 2576,
            "project_id": null
        }
    }
],

Результат, который я желаю. Уникальные сообщения, заказанные project_id:

"posts": [
    {
        "id": 733,
        "pivot": {
            "service_id": 20177,
            "post_id": 733,
            "id": 9723,
            "project_id": 4
        }
    },
    {
        "id": 725,
        "pivot": {
            "service_id": 20177,
            "post_id": 725,
            "id": 2576,
            "project_id": null
        }
    }
],

Спасибо, что нашли время помочь мне.

1 Ответ

0 голосов
/ 11 апреля 2019

При извлечении posts будет возвращена коллекция.

Затем вы можете упорядочить результаты (используя пользовательскую логику) в порядке убывания, используя ->sortByDesc() метод сбора :

$posts = $service->posts
    ->sortByDesc(function ($post, $key) {
        return $post['pivot']['project_id'];
    })
    ->values()
    ->all();

Здесь posts отсортированы в порядке убывания по сводному значению post_id из post (не уверен, что к нему обращаются через синтаксис -> или ключ массива, как я не сделалпроверено).

Чтобы удалить любые дубликаты (проверяя, является ли project_id не ноль), вы должны использовать -wherePivot():

public function posts()
{
    return $this->belongsToMany('App\Post')
        ->withPivot('id', 'unity', 'coefficient', 'project_id')
        ->wherePivot('project_id', '=!', null)
        ->orderBy('project_id', 'DESC')
        ->groupBy(['post_id']);
}
...