Laravel在关系中使用唯一的集合
Laravel在关系中使用唯一的集合
通过以下代码从数据库获取数据:
$allTickets = Ticket::with(['user','replies','supporters'])->whereUserId(auth()->user()->id)->get();
返回给我一个包含2个索引的数组,其中所有这些项都有supporters
关系,而且都是相同的。现在我的问题是如何在collections
中使用unique
。
我尝试的代码:
@foreach($allTickets as $supporter) @php $unique = $supporter->supporters->unique(); @endphp @foreach($unique->values()->all() as $user) ... ... ... @endforeach @endforeach
Laravel在使用集合中的关联关系时使用unique方法会出现错误,解决方法是在从数据库中获取数据时就进行筛选。可以通过在关联关系的属性中进行分组来实现,只需在查询中传入一个闭包来处理预加载的内容。具体代码如下所示:
$allTickets = Ticket::with(['user','replies'])->with([ 'supporters' => function($query) { $query->groupBy('id'); } ])->whereUserId(auth()->user()->id)->get();
但是在执行上述代码时可能会遇到以下错误:
Syntax error or access violation: 1055 'xDATABASEx.users.id' isn't in GROUP BY (SQL: select `users`.*, `ticket_user`.`ticket_id` as `pivot_ticket_id`, `ticket_user`.`user_id` as `pivot_user_id` from `users` inner join `ticket_user` on `users`.`id` = `ticket_user`.`user_id` where `ticket_user`.`ticket_id` in (1, 2) and `users`.`deleted_at` is null group by `user_id`)
可以参考以下链接了解更多信息:点击查看
问题的出现的原因是在使用unique()方法后,没有使用values()方法对集合进行重新索引,导致出现错误。
解决方法是在使用unique()方法后,需要使用values()方法对集合进行重新索引,即可解决该错误。
具体的解决代码如下所示:
$allTickets = collect(Ticket::with(['user','replies','supporters'])->whereUserId(auth()->user()->id)->get()); $allUniqueTickets = $allTickets->unique(); $tickets = $allUniqueTickets->values()->all();
通过以上代码,我们可以轻松地从控制器中获取所有唯一的值。希望这个回答能解决你的问题。
如果需要更多信息,你可以查看[Laravel官方文档中关于unique()方法的说明](https://laravel.com/docs/7.x/collections#method-unique)。
另外,如果你遇到了错误信息"Property [values] does not exist on this collection instance.",那是因为我之前忘记在values后面加上括号,你可以现在校对一下。我已经编辑了之前的答案。