Laravel eloquent 搜索名称关系

Laravel eloquent search for name relation

好吧,我有点卡住了。 我在我的项目中创建了一个组系统。 群系统为5款:

  1. 组别
  2. 群组成员
  3. 群发
  4. 群发评论

我想做的是通过用户名输入搜索组中的成员。 但是我只将 user_id 存储在 GroupMember 模型中,而不是存储在 User 模型中的用户名。我还没有与用户模型中的组有任何关系。

我必须输入某种关系吗? Morph关系我还没搞明白

这里列出了一些需要模型的组的关系。

群模型

public function category() {
    return $this -> belongsTo('App\GroupCategory', 'category_id');
}

public function owner() {
    return $this -> hasOne('App\GroupMember', 'group_id') -> where('owner', true);
}

public function mods() {
    return $this -> hasMany('App\GroupMember', 'group_id') -> where('mod', true);
}

public function members() {
    return $this -> hasMany('App\GroupMember', 'group_id');
}

public function posts() {
    return $this -> hasMany('App\GroupPost', 'group_id');
}

public function comments() {
    return $this -> hasMany('App\GroupPostComment', 'group_id');
}

群组成员模型

public function groups() {
    return $this -> belongsToMany('App\Group');
}

public function posts() {
    return $this -> hasMany('App\GroupPost');
}

public function comments() {
    return $this -> hasMany('App\GroupPostComment');
}

public function user() {
    return $this -> belongsTo('App\User');
}

澄清一下。我有一个输入字段,管理员可以在其中输入他要查找的字母或用户名的一部分,然后进行 AJAX 搜索,只查找组中的成员,但它按用户名查找。而username不在GroupMember模型中,而是在User模型中。

我该怎么做?

提前致谢。

编辑:控制器方法。

 /**
 * @param Group $group
 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
 *
 * Manage users
 */
public function getManageUsers(Group $group) {

    $group = $group -> with('members.user');

    // Usernames can be "test0", "test1", "test2"
    // If i search "1" only "test1" should be in the result
    $yourSearchQuery = '1';

    // The query
    $result = $group -> whereHas('members', function ($query) use ($yourSearchQuery) {
        $query -> whereHas('user', function ($query) use ($yourSearchQuery) {
            $query -> where('name', 'LIKE', '%'. $yourSearchQuery .'%');
        });
    }) -> get();

    // Check the results manually
    // It still returns all members of the group
    dd($result);

}

您可以通过关系获取数据,例如尝试此代码:

$group = Group::first();

return $group->members->user

别忘了:

use (namespace of group model)

搜索:

$yourSearchQuery - 字符串我们必须找到的内容

$group = Group::with('members.user');

$result = $group -> whereHas('members', function ($query) use ($yourSearchQuery) {
    $query -> whereHas('user', function ($query) use ($yourSearchQuery) {
        $query->where('name', 'LIKE', '%'. $yourSearchQuery .'%');
    }
})->get();

所以我终于修好了! 只需要稍微修改一下 Odin Thunder 的答案。

这是有效的查询。

$result = $group -> members() -> whereHas('user', function($query) use($q) {
    $query -> where('name', 'LIKE', '%'. $q .'%');
}) -> get();