У меня belongsToMany
красноречивые отношения между App/Models/User
и App/Models/Role
. Отношения между пользователем и ролью хранятся в role_user
сводной таблице. Я пытаюсь создать фильтр расширенного поиска, который будет отображать мне список пользователей с определенными критериями роли.
Я уже сделал это для критериев электронной почты, т.е. соответствующий пользователь будет отображаться, если электронная почта зарегистрированного пользователя совпадает с вводом. Этого было легко добиться, поскольку столбец электронной почты существует в самой таблице пользователей.
Как я могу добиться того же для критериев роли, которые будут относиться к пользователю через сводную таблицу и будут отображать конечное количество пользователей с выбранной ролью.
Приложение / модели / пользователь
public function roles() {
return $this->belongsToMany(Role::class);
}
Приложение / модели / роль
public function users() {
return $this->belongsToMany(User::class);
}
Приложение / HTTP / Livewire / UserController
public $filters = [
'email' => null,
'role' => ''
];
public function render() {
$users = User::query()
-> when($this -> filters['email'], fn($query, $email) => $query -> where('email', $email))
-> when($this -> filters['role'], fn($query, $role) => $query -> with('roles') -> where('id', $role))
-> search('name', $this -> search)
-> paginate(5);
$roles = Role::all();
return view('livewire.user-controller', ['users' => $users, 'roles' => $roles]);
}
ресурсы / представления / livewire / пользователь-контроллер
<!-- Advanced Search -->
<div>
@if ($showFilters)
<div>
<div>
<x-input.group inline for="filter-email" label="Email">
<x-input.text wire:model.lazy="filters.email" id="filter-email" placeholder="Enter Email" />
</x-input.group>
</div>
<div>
<x-input.group inline for="filter-role" label="Role">
<x-input.select wire:model.lazy="filters.role" id="filter-role" placeholder="Select Role">
@foreach($roles as $role)
<option value="{{ $role->id }}">{{ $role->name }}</option>
@endforeach
</x-input.select>
</x-input.group>
</div>
</div>
@endif
</div>
<!-- Users Table -->
<x-table>
<x-slot name="head">
<x-table.heading>
<x-input.checkbox />
</x-table.heading>
<x-table.heading>ID</x-table.heading>
<x-table.heading>Name</x-table.heading>
<x-table.heading>Email</x-table.heading>
<x-table.heading>Role</x-table.heading>
</x-slot>
<x-slot name="body">
@foreach($users as $key => $user)
<x-table.row wire:loading.class.delay="opacity-50">
<x-table.cell wire:key="row-{{ $user->id }}">
<x-input.checkbox wire:model="selected" value="{{ $user->id }}" />
</x-table.cell>
<x-table.cell>{{ $users->firstitem() + $key }}</x-table.cell>
<x-table.cell>{{ $user->name }}</x-table.cell>
<x-table.cell>{{ $user->email }}</x-table.cell>
<x-table.cell>
@foreach($user->roles as $role)
{{ $role->name }}
@endforeach
</x-table.cell>
</x-table.row>
@endforeach
</x-slot>
</x-table>
whereHas
с функцией обратного вызова для фильтрации результатов запроса на основе отношения. laravel.com/docs/8.x/ - person miken32   schedule 02.12.2020