php - Laravel 5.7 - 从当前用户组中获取所有用户
问题描述
这是我目前使用的结构
模型用户:
class User extends Authenticatable implements MustVerifyEmail
public function groups()
{
return $this->belongsToMany('App\Group')
->withTimestamps();
}
模型组:
class Group extends Model
public function users() {
return $this->belongsToMany('App\User')
->withTimestamps();
}
数据透视表 :
Schema::create('group_user', function (Blueprint $table) {
$table->integer('group_id');
$table->integer('user_id');
$table->integer('role_id')->nullable();
$table->timestamps();
});
我想获取当前用户的同一组中的所有用户并且不返回重复用户(一个用户可以在多个组中)。理想的功能是:
$user->contacts()
// Return an object with (unique) contacts of all current user groups
AND
$user->groupContacts($group)
// Witch is the same as $group->users
// Return an object with all the users of the current group
我正在处理的不是功能性功能(Model User.php):
public function contacts()
{
$groups = $this->groups;
$contacts = new \stdClass();
foreach ($groups as $key => $group) :
$contacts->$key = $group->users;
endforeach;
return $contacts;
}
我真的不是表格结构方面的专家,所以如果有更好的方法来做到这一点,我只是在这个个人项目的开始,所以没有什么是一成不变的。
可选的东西:
- 从列表中排除当前用户
- 使用数据透视表中的角色
- 使用软删除
解决方案
您可以在您的用户模型上尝试这样的事情
public function contacts()
{
// Get all groups of current user
$groups = $this->groups()->pluck('group_id', 'group_id');
// Get a collection of all users with the same groups
return $this->getContactsOfGroups($groups);
}
public function groupContacts($group)
{
// Get a collection of the contacts of the same group
return $this->getContactsOfGroups($group);
}
public function getContactsOfGroups($groups)
{
$groups = is_array($groups) ? $groups : [$groups];
// This will return a Collection Of Users that have $groups
return \App\User::whereHas('groups', function($query) use($groups){
$query->whereIn('group_id', $groups);
})->get();
}
推荐阅读
- python - 如何让 `pip freeze` 使用我的 Flask 模块的分支?
- sql-server - TSQL 选择符合条件的记录或第一个
- reactjs - 移动离线同步
- mysql - MySql:如何显示每个用户创建的所有任务?
- vue.js - Vue.js 如何将滚动位置设置回顶部?
- pandas - isinstance(df, pd._libs.tslib.Timestamp) 它有什么作用?
- c++ - 为什么 range::split_view 不是双向范围?
- javascript - 在鼠标 Y + 适应上更改 2 种背景颜色
到那个新颜色
- linux - 无法在 Linux 上运行 VSCode
- aframe - 将自定义键添加到 aframe-super-keyboard