无法为角色创建搜索筛选器,该筛选器将显示具有选定角色的所有用户-Laravel

无法为角色创建搜索筛选器,该筛选器将显示具有选定角色的所有用户-Laravel,laravel,eloquent,laravel-8,Laravel,Eloquent,Laravel 8,我在App/Models/User和App/Models/Role之间有一种belongtomany雄辩的关系。用户和角色之间的关系存储在透视表中。我正在尝试创建一个高级搜索筛选器,它将向我显示特定角色条件下的用户列表 我已经针对电子邮件标准这样做了,即,如果注册用户的电子邮件与输入匹配,将显示相关用户。这很容易实现,因为电子邮件列存在于用户表中 如何实现角色标准的相同功能,角色标准将通过数据透视表与用户相关,并将显示具有所选角色的最终用户数 应用程序/型号/用户 public functio

我在
App/Models/User
App/Models/Role
之间有一种
belongtomany
雄辩的关系。用户和角色之间的关系存储在透视表中。我正在尝试创建一个高级搜索筛选器,它将向我显示特定角色条件下的用户列表

我已经针对电子邮件标准这样做了,即,如果注册用户的电子邮件与输入匹配,将显示相关用户。这很容易实现,因为电子邮件列存在于用户表中

如何实现角色标准的相同功能,角色标准将通过数据透视表与用户相关,并将显示具有所选角色的最终用户数

应用程序/型号/用户

public function roles() {
    return $this->belongsToMany(Role::class);
}
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]);
}
<!-- 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>
应用程序/模型/角色

public function users() {
    return $this->belongsToMany(User::class);
}
App/Http/Livewire/UserController

public function roles() {
    return $this->belongsToMany(Role::class);
}
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]);
}
<!-- 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>
resources/views/livewire/user controller

public function roles() {
    return $this->belongsToMany(Role::class);
}
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]);
}
<!-- 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>

@如果($showFilters)
@foreach($roles作为$role)
{{$role->name}
@endforeach
@恩迪夫
身份证件
名称
电子邮件
角色
@foreach($user as$key=>$user)
{{$users->firstitem()+$key}
{{$user->name}
{{$user->email}
@foreach($user->roles as$role)
{{$role->name}
@endforeach
@endforeach

检索id为5的角色的所有用户

//假设此角色id(5)是用户从select中选择角色后收到的
$roleId=5;
$users=User::whereHas('roles',function($query)use($roleId){
返回$query->where('id',$roleId);
});

谢谢你的回答,你能帮我让它以查询格式工作吗。User::query()->when($this->filters['role',fn($query,$role)=>$query->with('roles')->where('id',$role)),因为我需要将其与函数状态绑定,以便在($this->filters['role')时检测请求。感谢您抽出时间

User::query()
->什么时候(
$this->filters['role'],
fn($query,$role)=>$query->whereHas(
"角色",,
fn($query)=>$query->where('id',$role)
)
)

您可以使用带有回调函数的
whereHas
来根据关系过滤查询结果。@miken32请您更详细地描述一下,您能帮助我编写代码吗,因为我从4天以来一直被困在同一个地方,我知道这可能很愚蠢,但我对Laravel来说是非常陌生的。我感谢您的帮助!谢谢您的回答,您可以帮助我让它以查询格式工作。
User::query()->when($this->filters['role'),fn($query,$role)=>$query->with('roles')->where('id',$role))
,因为我需要将它与函数的状态绑定起来,以便在($this->filters['role')]时检测请求。谢谢您的时间。在我尝试的过程中,我遇到了错误,因为我没有在查询中正确地建立和关联关系。@ToxifiedHashkey已更新了答案,请检查并让我知道这对您有效