首页 > 解决方案 > Laravel 对关系中的集合使用唯一性

问题描述

通过此代码从数据库中获取数据:

$allTickets = Ticket::with(['user','replies','supporters'])->whereUserId(auth()->user()->id)->get();

为我返回这个结果,它在数组中有 2 个索引,并且所有这些项目我都有supporters关系,两者都是相同的,现在我的问题是我如何unique使用collections

Illuminate\Database\Eloquent\Collection {#1550 ▼
  #items: array:2 [▼
    0 => Modules\Ticket\Entities\Ticket {#1548 ▼
      #guarded: array:1 [▶]
      #connection: "mysql"
      #table: "tickets"
      ...
      #relations: array:3 [▼
        "user" => App\User {#1575 ▶}
        "replies" => Illuminate\Database\Eloquent\Collection {#1565 ▶}
        "supporters" => Illuminate\Database\Eloquent\Collection {#1572 ▼
          #items: array:1 [▼
            0 => App\User {#1585 ▼
              ...
              #attributes: array:19 [▼
                "id" => 1
                "user_id" => null
                ...
                "api_token" => "a"
                "remember_token" => null
                "deleted_at" => null
                "created_at" => "2020-06-14 13:56:45"
                "updated_at" => "2020-06-14 13:56:45"
              ]
              ...
            }
          ]
        }
      ]
      ...
    }
    1 => Modules\Ticket\Entities\Ticket {#1567 ▼
      #guarded: array:1 [▶]
      #connection: "mysql"
      #table: "tickets"
      ...
      #relations: array:3 [▼
        "user" => App\User {#1575 ▶}
        "replies" => Illuminate\Database\Eloquent\Collection {#1551 ▶}
        "supporters" => Illuminate\Database\Eloquent\Collection {#1559 ▼
          #items: array:1 [▼
            0 => App\User {#1585 ▼
              ...
              #attributes: array:19 [▼
                "id" => 1
                "user_id" => null
                ...
                "api_token" => "a"
                "remember_token" => null
                "deleted_at" => null
                "created_at" => "2020-06-14 13:56:45"
                "updated_at" => "2020-06-14 13:56:45"
              ]
              ...
            }
          ]
        }
      ]
      ...
    }
  ]
}

我测试过的代码:

@foreach($allTickets as $supporter)
    @php
    $unique = $supporter->supporters->unique();
    @endphp
    @foreach($unique->values()->all() as $user)
      ...
      ...
      ...
    @endforeach
@endforeach

标签: phplaravellaravel-7

解决方案


或者你可以这样查询:

$allTickets = collect(Ticket::with(['user','replies','supporters'])->whereUserId(auth()->user()->id)->get());
$allUniqueTickets = $allTickets->unique();
$tickets = $allUniqueTickets->values()->all();

这样您就可以轻松地从控制器中获取所有唯一值。我希望这回答了你的问题。有关更多信息,您可以查看https://laravel.com/docs/7.x/collections#method-unique


推荐阅读