Laravel基于user_id在集合中分离项的方法



在Event-model中,我有这样的关系:

public function eventQuestionUsers(){ 
return $this->hasMany( 'AppEventQuestionUsers' );
}

当我在控制器中得到$event时,我这样做:

public function show( $event_id ){
$user = Auth::user();
$event = Event::where( [ 'id', '=', $event_id ] )->get();
if( $user->can( 'manage', $event ) ){
$event->load( 'eventQuestionUsers' );
}
return view( single_event, [
'event' => $event
]);
}

但是现在我想让集合根据user_id拆分eventQuestionUsers。所以它看起来像这样:

$event = [
'name' => 'Blah blah',
'date' => '2021-09-18 20:30:00'
'eventQuestionUsers' => [
15 => [ // 15 is a user_id
$eventQuestionUser,
$eventQuestionUser,
],
16 => [ // 16 is a user_id
$eventQuestionUser,
$eventQuestionUser,
$eventQuestionUser,
$eventQuestionUser,
],
18 => [ // 18 is a user_id
$eventQuestionUser,
$eventQuestionUser,
],
]

解决方案尝试通常我会做一个公共的静态帮助函数,它接受$eventQuestionUsers和一个输入,并返回我想要的,通过迭代整个这,像这样:

public static function clusterEventQuestionUsersBasedOnUserId( $eventQuestionUsers ){
$returned = [];
foreach( $eventQuestionUsers as $eventQuestionUser ){
$user_id = $eventQuestionUser->user_id;
if( ! array_key_exists( $user_id, $returned ) ){
$returned[ $user_id ] = [];
}
$returned[ $user_id ][] = $eventQuestionUser;
}
return $returned;
}

我不会使用集合,因为它是不可变的,所以像上面看到的那样添加条目通常有点麻烦。

什么是"Laravel方式"?还是听起来不错?感觉很"非旅行"。

默认情况下,$event->eventQuestionUsers是一个集合实例,这意味着您可以直接在其上使用laravel集合方法,在本例中是groupBy()。所以

public function show( $event_id ){
$user = Auth::user();
$event = Event::where( [ 'id', '=', $event_id ] )->get();
if( $user->can( 'manage', $event ) ){
$event->load( 'eventQuestionUsers' );
$event->eventQuestionUsers->groupBy('user_id');//the only new stuff
}
return view( single_event, [
'event' => $event
]);
}

我不确定我是否理解正确,但是如果你有user_id在你的关系中,你可以按你的惰性急切负载分组,像这样

$event->load(['eventQuestionUsers' => function($query) {
$query->groupBy('user_id');
}]);

Laravel文档

最新更新