或从关系中获取数据时,Laravel中的Where行为不当

qzwqbdag  于 2022-10-22  发布在  PHP
关注(0)|答案(2)|浏览(146)

我有一个控制器方法,用于使用电子邮件和名称搜索给定用户组中的用户。我有两组客户员工,当我搜索员工时,它也会返回客户。
这是控制器代码

public function index(Request $request, UserGroup $group) { //group=staff
        $users = $group->users();

        if ($request->has('search') && $request->search) {
            $users->where('name', 'LIKE', '%' . $request->search . '%')
                ->orWhere(function ($builder) use ($request) {
                    $builder->where('email', 'LIKE', '%' . $request->search . '%');
                });
        }

        return response()->json($users->get());

   }

在UserGroup模型中,这里是代码的实现

class UserGroup extends Model{

    //...

    public function users(): BelongsToMany | User | Collection
    {
        return $this->belongsToMany(User::class, 'user_user_group');
    }

   //...

}

我只想要UserGroup staff的用户,并且在搜索关键字中键入姓名或电子邮件。相反,系统甚至会返回没有员工用户组的用户。
我做错了什么?

cs7cruho

cs7cruho1#

你在写where子句时用了错误的方法。当您在外部使用orWhere时,它告诉laravel查询将组表上的用户表与第一个条件或第二个条件连接起来。它应该是组表和(第一个条件或第二个条件)上的联接。当它执行查询时,它应该用圆括号括起来。
您的查询应该是:

$users = $group->users();

    if ($request->has('search') && $request->search) {
        $users->where(function ($builder) use ($request) {
            $builder->orWhere('name', 'LIKE', '%' . $request->search . '%');
            $builder->orWhere('email', 'LIKE', '%' . $request->search . '%');
        });
    }

我希望这对你有帮助。有关更多信息,我建议阅读laravel官方文档。Laravel查询生成器

iqxoj9l9

iqxoj9l92#

您还可以从User::class透视图查询

User::query()
      ->where("name", "LIKE", "%{$request->search}%")
      ->orWhere("email", "LIKE", "%{$request->search}%")
      ->where(function(Builder $query) {
            $query->whereRelation('#group', '#groupColumn','staff')
      })->get();

此查询将获取与员工组具有搜索名称或电子邮件的用户。
我不知道您的用户组和用户之间的关系,只需将单词改为#以匹配您的用户。
#group=UserGroupUser的关系,就像users()UserGroup::class之间的关系一样。
#groupColumn=staff所属的列。
希望有帮助。

相关问题