按组排序依据Eloquent属于ToMany关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按组排序依据Eloquent属于ToMany关系相关的知识,希望对你有一定的参考价值。

我希望得到project_id订购的独特帖子,基本上,如果有重复的帖子我想要一个project_id不是null。有没有办法得到这个?

此代码返回唯一的帖子,但project_id没有订购它们。

/**
 * Get the posts record associated with the service.
 */
public function posts()
{
    return $this->belongsToMany('AppPost')
        ->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

贝娄我展示了我得到的结果和我想要的结果:

我删除了其他数据以便更好地阅读

结果与groupByorderBy条款。独特的帖子,但没有由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
        }
    }
],

我感谢您抽出宝贵时间帮助我。

答案

检索posts时,将返回一个集合。

然后,您可以使用->sortByDesc() collection method按降序排序结果(使用自定义逻辑):

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

这里qazxsw poi按照posts的qazxsw poi降序排序(不确定这是通过post_id语法或数组键访问,因为我还没有测试过)。

要删除任何重复项(检查post是否为null),您应该使用->

project_id

以上是关于按组排序依据Eloquent属于ToMany关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5 / Eloquent - 对属于多的关系进行查询过滤

Cakephp 3 保存关联属于ToMany

基于多对多关系检索 Eloquent 模型

Laravel Eloquent 按关系计数排序

Laravel 属于ToMany 获得一条记录

Laravel Eloquent 按关系表列排序