Если пользователь входит в группу в октябре CMS - плагин пользователя
Я пытаюсь отфильтровать пользователей из определенной группы пользователей в компоненте в PHP. Во-первых, я ищу конкретного пользователя по ключевому слову, затем я хочу проверить, принадлежит ли этот пользователь к какой-то определенной группе "mygroupcode". В идеале эти два утверждения должны быть объединены.
Я пробовал следующее:
public function onSelect() {
$s2_opts = [];
foreach(User::where('surname', 'LIKE', '%'.Input::get('q').'%')->orWhere('name', 'LIKE', '%'.Input::get('q').'%')->get() as $user) {
if($user->groups()->whereName('mygroupcode')->exists()) {
array_push($s2_opts, array('id' => $user->id, 'text' => $user->name . ' ' . $user->surname));
}
}
return json_encode($s2_opts);
}
Это бросает MySQL-ошибку. Что-то вроде стола mydb.groups
не найден... В базе данных следует искать группы пользователей.
Также я попробовал:
public function onSelect() {
$s2_opts = [];
foreach(User::where('surname', 'LIKE', '%'.Input::get('q').'%')->orWhere('name', 'LIKE', '%'.Input::get('q').'%')->get() as $user) {
if(in_array('mygroupcode',array_keys($user->groups))) {
array_push($s2_opts, array('id' => $user->id, 'text' => $user->name . ' ' . $user->surname));
}
}
return json_encode($s2_opts);
}
Это также приводит к ошибке MySQL. Похоже, тоже про стол groups
не найден
Кроме того, я заметил, что есть метод с именем inGroup(), но это приводит к той же ошибке...
public function onSelect() {
$s2_opts = [];
foreach(User::where('surname', 'LIKE', '%'.Input::get('q').'%')->orWhere('name', 'LIKE', '%'.Input::get('q').'%')->get() as $user) {
if($user->inGroup('mygroupcode')) {
array_push($s2_opts, array('id' => $user->id, 'text' => $user->name . ' ' . $user->surname));
}
}
return json_encode($s2_opts);
}
Что я делаю неправильно? Спасибо заранее за ваше время.
Пожалуйста, обратите внимание на следующие связанные вопросы. Они касаются внутренних пользовательских списков, я ищу, чтобы отфильтровать внешних пользователей.
2 ответа
Если вы посмотрите на InGroup
Функция Param - это не строка (код), а объект:
/**
* See if the user is in the given group.
* @param Group $group
* @return bool
*/
public function inGroup($group)
{
foreach ($this->getGroups() as $_group) {
if ($_group->getKey() == $group->getKey()) {
return true;
}
}
return false;
}
Вы можете добавить в свою модель UserGroup метод, скажем так:
const GROUP_ADMIN = 'admin'; // admin is the group unique code
public static function getAdminGroup()
{
return self::where('code', self::GROUP_ADMIN)->first() ;
}
Затем вы можете использовать этот метод, чтобы проверить, находится ли пользователь в группе
public function onSelect() {
$q = Input('q', false );
if (!empty ($q)) {
$users = User::searchWhere( $q , 'surname' )
->searchWhere( $q , 'name' )
->get();
if ( count ($users) ) {
$s2_opts = [];
$users->each( function( $user ) {
if( $user->inGroup( UserGroupModel::getAdminGroup() )) {
// User is in Group... Push to Array
}
});
return json_encode($s2_opts);
} else {
// No users found...
}
}
}
Также взгляните на метод фильтра, который вы можете вернуть отфильтрованную коллекцию на основе некоторых условий
$filteredUsers = $users->filter(function ( $user ) {
return $user->inGroup( UserGroupModel::getAdminGroup() ) ;
});
Мне удалось получить рабочее решение, опираясь на построитель запросов. Я сомневаюсь, что это оптимальное решение, но пока оно работает. Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать:
public function onSelect() {
$s2_opts = [];
foreach(User::select('users.id', 'users.surname', 'users.name')
->join('users_groups', 'users.id', '=', 'users_groups.user_id')
->join('user_groups', 'users_groups.user_group_id', '=', 'user_groups.id')
->where('user_groups.code','mygroupcode')
->where(function ($query) {
$query->where('users.surname', 'LIKE', '%'.Input::get('q').'%')->orWhere('users.name', 'LIKE', '%'.Input::get('q').'%');
})
->groupBy('users.id')
->get() as $user) {
array_push($s2_opts, array('id' => $user->id, 'text' => $user->name . ' ' . $user->surname));
}
return json_encode($s2_opts);
}