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;

}

Я на самом деле не эксперт по структурам таблиц, поэтому, если есть лучший способ сделать это, я только в начале этого личного проекта, так что ничего не написано в камне.

Дополнительные материалы:

  • Исключить текущего пользователя из списка
  • С ролями из сводной таблицы
  • С softdelete

0

Решение

Вы можете попробовать что-то подобное на своей модели пользователя

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();
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]