【问题标题】:Laravel collection get unique order by dateLaravel 集合按日期获取唯一顺序
【发布时间】:2020-06-24 08:46:04
【问题描述】:

我有一个集合,我已经能够排序返回给我,按用户 ID 和日期排序,问题是我需要获得一个具有最新日期的唯一用户,但我无法得到它. 这是我的 json:

{
    "168": {
        "created_at": "2019-01-23 12:40:26",
        "user_id": 1,
        "from": "form",
        "name": "Pedro",
        "lastname": "Pretgar",
        "email": "pedro@demo.com"
    },
    "154": {
        "created_at": "2019-06-28 13:34:21",
        "user_id": 1,
        "from": "form",
        "name": "Pedro",
        "lastname": "Pretgar",
        "email": "pedro@demo.com"
    },
    "167": {
        "created_at": "2019-01-31 17:33:26",
        "user_id": 8,
        "from": "gmail",
        "name": "Lilian",
        "lastname": "Houster",
        "email": "lilian@demo.com"
    },
    "156": {
        "created_at": "2019-06-08 12:14:42",
        "user_id": 14,
        "from": "form",
        "name": "Jhon",
        "lastname": "Cobra",
        "email": "jhon@demo.com"
    },
    "38": {
        "created_at": "2019-07-21 21:22:18",
        "user_id": 14,
        "from": "form",
        "name": "Jhon",
        "lastname": "Cobra",
        "email": "jhon@demo.com"
    },
    "81": {
        "created_at": "2019-09-25 10:24:34",
        "user_id": 14,
        "from": "form",
        "name": "Jhon",
        "lastname": "Cobra",
        "email": "jhon@demo.com"
    }
}

我需要这个结果:

{

    "154": {
        "created_at": "2019-06-28 13:34:21",
        "user_id": 1,
        "from": "form",
        "name": "Pedro",
        "lastname": "Pretgar",
        "email": "pedro@demo.com"
    },
    "167": {
        "created_at": "2019-01-31 17:33:26",
        "user_id": 8,
        "from": "gmail",
        "name": "Lilian",
        "lastname": "Houster",
        "email": "lilian@demo.com"
    },
    "81": {
        "created_at": "2019-09-25 10:24:34",
        "user_id": 14,
        "from": "form",
        "name": "Jhon",
        "lastname": "Cobra",
        "email": "jhon@demo.com"
    }
}

我试过,按日期排序,然后得到唯一值,问题是我不知道如何先按最新日期排序,然后得到唯一值。

$tmp = $users->sortBy(function($user) {
            return [$user->user_id, $user->created_at];
        })->unique('user_id');

【问题讨论】:

  • 试试groupBy('user_id)

标签: laravel collections


【解决方案1】:

此代码将起作用:

$users
    ->sortByDesc('created_at')
    ->unique('user_id');

按desc方法排序:https://laravel.com/docs/7.x/collections#method-sortbydesc

唯一方法:https://laravel.com/docs/7.x/collections#method-unique

它将返回这个数组:

    81 => { #9 ▼
      +"created_at": "2019-09-25 10:24:34"
      +"user_id": 14
      +"from": "form"
      +"name": "Jhon"
      +"lastname": "Cobra"
      +"email": "jhon@demo.com"
    }
    154 => {#5 ▼
      +"created_at": "2019-06-28 13:34:21"
      +"user_id": 1
      +"from": "form"
      +"name": "Pedro"
      +"lastname": "Pretgar"
      +"email": "pedro@demo.com"
    }
    167 => {#6 ▼
      +"created_at": "2019-01-31 17:33:26"
      +"user_id": 8
      +"from": "gmail"
      +"name": "Lilian"
      +"lastname": "Houster"
      +"email": "lilian@demo.com"
    }

如果您想要确切的数组,按最近日期和我猜的 user_id 排序,您可以使用 user_id 与另一个 sort 方法链接:

$users
    ->sortByDesc('created_at')
    ->sortBy('user_id')
    ->unique('user_id');

它将返回这个数组:

154 => {#5 ▼
  +"created_at": "2019-06-28 13:34:21"
  +"user_id": 1
  +"from": "form"
  +"name": "Pedro"
  +"lastname": "Pretgar"
  +"email": "pedro@demo.com"
}
167 => {#6 ▼
  +"created_at": "2019-01-31 17:33:26"
  +"user_id": 8
  +"from": "gmail"
  +"name": "Lilian"
  +"lastname": "Houster"
  +"email": "lilian@demo.com"
}
81 => {#9 ▼
  +"created_at": "2019-09-25 10:24:34"
  +"user_id": 14
  +"from": "form"
  +"name": "Jhon"
  +"lastname": "Cobra"
  +"email": "jhon@demo.com"
}

【讨论】:

  • 使用此代码 $users->sortByDesc('created_at')->sortBy('user_id')->unique('user_id');不是按 created_at 和 user_id 排序,而是返回:2019-01-23 12:40:26 -> Pedro -> id 1。但使用 $users ->sortByDesc('created_at') ->unique('user_id');返回:2019-06-28 13:34:21 -> Pedro -> id 1.
【解决方案2】:

你可以试试

$users->orderBy('created_at', 'desc')
     ->orderBy('user_id', 'asc')
     ->groupBy('user_id')
     ->get();

【讨论】:

  • OP说他有收藏而不是模特
猜你喜欢
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2019-10-30
相关资源
最近更新 更多