2017-02-10 20 views
1

さて、私は少し固執しています。 プロジェクトにグループシステムを作成しました。私は何をしようとしていることでメンバーのための検索です 名前関係の雄弁な検索

GroupMember

  • GroupPost
  • GrouPostComment

    1. グループ
    2. グループ項目
    3. : グループシステムは、5つのモデルでありますユーザー名入力によるグループ。 しかし、私はGroupMemberモデルにuser_idを格納し、ユーザモデルに格納されているユーザ名は格納しません。私は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'); 
      } 
      

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

      ちょうどclearifyします。私は管理者が彼が探しているユーザー名の一部または文字を入力することができる入力フィールドを持っています。それはグループ内のメンバーだけを探すAJAX検索を行いますが、ユーザー名で表示されます。また、ユーザー名はGroupMemberモデルではなく、Userモデルにあります。

      どうすればよいですか?

      ありがとうございます。

      編集:コントローラメソッド。

      $group = Group::first(); 
      
      return $group->members->user 
      

      ドンの `tは忘れて:検索し

      use (namespace of group model) 
      

      $ yourSearchQuery

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

    コントローラメソッドをajaxリクエストに表示できますか? – Adam

    +0

    現時点では、単に検索が機能しているかどうかを確認するために、 'dd($ result)'を手動で検索します。 Odin Thunderが投稿したコードを試しました。 – Kaizokupuffball

    +0

    ご覧のとおり、コントローラメソッドを追加しました。 – Kaizokupuffball

    答えて

    2

    私は最終的にそれを修正しました。 ちょっとオーディン・サンダーの答えを修正しなければなりませんでした。

    これは動作するクエリでした。

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

    あなたは、例えば、このコードを試してみてください、リレーションを介してデータを取得することができます - 見つけなければならない文字列

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

    そうです、私は知っています。しかし、私はどのようにユーザー名で検索しますか?私はすでにグループのすべてのメンバーを取得する方法を知っていますが、「test」という例を含むユーザー名を持つユーザーに対して、そのグループを検索するにはどうすればよいですか? – Kaizokupuffball

    +0

    答えを編集し、この解決策を試してください –

    +0

    うーん。だから私はこれを試した。しかし、それは動作していないようだ、すべてのメンバーを取得し、特定のユーザー名の後に検索しません。 ここに私が試したコードのペーストビンです:http://pastebin.com/zziR83Js – Kaizokupuffball