2017-02-10 6 views
1

Okay, also bin ich ein bisschen fest. Ich habe ein Gruppensystem in meinem Projekt erstellt. Das Gruppensystem ist 5 Modelle:Laravel eloquent Suche nach Namen Beziehung

  1. Gruppe
  2. Gruppe
  3. Gruppenmitglied
  4. GroupPost
  5. GrouPostComment

Was ich versuche für die Mitglieder ist eine Suche zu tun, in eine Gruppe nach Eingabe des Benutzernamens. Aber ich speichere nur die user_id im GroupMember-Modell und nicht den Benutzernamen, der im User-Modell gespeichert ist. Ich habe noch keine Beziehungen zu Gruppen im Benutzermodell.

Gibt es irgendeine Art von Beziehung, die ich einfügen muss? Ich habe die Morph-Beziehung noch nicht verstanden.

Hier sind eine Liste der Beziehungen für die Gruppe einige der benötigten Modelle.

Gruppenmodell

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

Gruppenmitglied Modell

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

Gerade clearify. Ich habe ein Eingabefeld, in das der Admin einen Buchstaben oder Teile des gesuchten Benutzernamens eingeben kann, dann führt er eine AJAX-Suche durch, bei der nur nach Mitgliedern in der Gruppe gesucht wird, aber nach Benutzername. Und der Benutzername befindet sich nicht im GroupMember-Modell, sondern im Benutzermodell.

Wie würde ich das tun?

Vielen Dank im Voraus.

Bearbeiten: Die Controller-Methode.

/** 
* @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

Können Sie Ihre Controller-Methode für die Ajax-Anfrage zeigen? – Adam

+0

Im Moment mache ich nur eine manuelle Suche mit 'dd ($ result)', nur um zu überprüfen, ob die Suche funktioniert. Ich habe den Code ausprobiert, den Odin Thunder gepostet hat. – Kaizokupuffball

+0

Hinzugefügt die Controller-Methode, wie Sie sehen können. – Kaizokupuffball

Antwort

2

Also habe ich es endlich behoben! Ich musste nur die Antwort von Odin Thunder etwas modifizieren.

Dies war die Abfrage, die funktioniert.

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

Sie können Daten über Beziehungen erhalten, versuchen Sie diesen Code zum Beispiel:

$group = Group::first(); 

return $group->members->user 

Don`t vergessen:

use (namespace of group model) 

für die Suche:

$ yourSearchQuery - string was wir finden müssen

$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

Ja, ich weiß. Aber wie würde ich nach Benutzername suchen? Ich weiß bereits, wie man alle Mitglieder einer Gruppe erhält, aber wie suche ich diese Gruppe nach Benutzern, die einen Benutzernamen haben, der Beispiel enthält: 'test'? – Kaizokupuffball

+0

Bearbeiten Sie die Antwort, versuchen Sie diese Lösung –

+0

Hmm. Also habe ich das gerade versucht. Aber es scheint nicht zu funktionieren, es bekommt alle Mitglieder und sucht nicht nach dem angegebenen Benutzernamen. Hier ist ein Pastebin des Codes, den ich jetzt ausprobiert: http://pastebin.com/zziR83Js – Kaizokupuffball

Verwandte Themen