Laravel雄辩地寻找姓名关系

时间:2017-02-10 13:40:11

标签: php laravel eloquent relationship

好的,所以我有点卡住了。 我在我的项目中创建了一个组系统。 小组系统有5个型号:

  1. GroupCategory
  2. GroupMember
  3. GroupPost
  4. GrouPostComment
  5. 我要做的是通过用户名输入搜索组中的成员。 但我只将user_id存储在GroupMember模型中,而不是存储在User模型中的用户名。我与用户模型中的组没有任何关系。

    我必须加入某种关系吗? 我还没有理解变形关系。

    以下列出了该集团所需的一些模型的关系。

    群组模型

    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');
    }
    

    GroupMember模型

    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搜索,它只查找组中的成员,但它按用户名查找。用户名不在GroupMember模型中,而是在用户模型中。

    我该怎么做?

    提前致谢。

    编辑:控制器方法。

     /**
     * @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);
    
    }
    

2 个答案:

答案 0 :(得分:4)

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

这是有效的查询。

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

答案 1 :(得分:1)

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

$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();