Laravel在关系中使用唯一的集合

11 浏览
0 Comments

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

0
0 Comments

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`)

可以参考以下链接了解更多信息:点击查看

0
0 Comments

问题的出现的原因是在使用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后面加上括号,你可以现在校对一下。我已经编辑了之前的答案。

0