Laravel 对关系中的集合使用唯一性
Laravel using unique for collections in relationships
通过此代码从数据库中获取数据:
$allTickets = Ticket::with(['user','replies','supporters'])->whereUserId(auth()->user()->id)->get();
return 这个结果对我来说在数组中有 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
或者您可以这样查询:
$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
不要尝试在集合上做唯一性,尝试让你的数据已经从你的数据库中过滤掉。您可以按任何关系属性进行分组,只需传入一个闭包来处理对急切加载内容的查询,例如:
$allTickets = Ticket::with(['user','replies'])->with([
'supporters' => function($query) {
$query->groupBy('id');
}
])->whereUserId(auth()->user()->id)->get();
通过此代码从数据库中获取数据:
$allTickets = Ticket::with(['user','replies','supporters'])->whereUserId(auth()->user()->id)->get();
return 这个结果对我来说在数组中有 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
或者您可以这样查询:
$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
不要尝试在集合上做唯一性,尝试让你的数据已经从你的数据库中过滤掉。您可以按任何关系属性进行分组,只需传入一个闭包来处理对急切加载内容的查询,例如:
$allTickets = Ticket::with(['user','replies'])->with([
'supporters' => function($query) {
$query->groupBy('id');
}
])->whereUserId(auth()->user()->id)->get();