2017-02-07 2 views
1

Ich habe einen Benutzer, die Muttersprache sprichtEnglisch sagen läßt und will Französisch zu lernen.Suche nach einem Benutzerprofil Spiel in Laravel 5.3

Wie kann ich eine Liste der Übereinstimmung zu finden, wo Benutzer Muttersprache Französisch ist und will Englisch lernen. Es ist ein Sprachaustauschprogramm, also möchte ich Benutzer mit dem Spiel auflisten.

Ich habe Benutzer, Language_User und Sprache Tabelle. In der Language_User-Tabelle habe ich ein zusätzliches Feld namens type (learn oder native).

Benutzer

id

Name

...

Language_User

id

User_id

language_id

Typ ('lernen', 'native')

Sprache

id

Sprache

Abfragen

Zuerst erhalte ich alle Benutzer, die nicht habe eine Rolle als "Admin" oder ist nicht er/sie.

$other_users = User::with('languages')->with('departments')->with('hobbies')->with('universities')->with('years')->where([['id', '<>', Auth::user()->id],['role', '<>', 2]])->get(); 

Dann erhalte ich eingeloggt hat lernen Benutzer $ Sprache und Muttersprache $ mit anderen Nutzern zu vergleichen

$learn = Auth::user()->languages()->wherePivot('type', 'learn')->select('language_id')->first(); 

$native = Auth::user()->languages()->wherePivot('type', 'native')->select('language_id')->first(); 

In View

loggedin Benutzersprache

{{$learn->language_id}} 
zu lernen gibt

gibt eingeloggte Benutzer Muttersprache

{{$native->language_id}} 

Code anzeigen

@foreach($other_users as $user) 

    @foreach($user->languages as $lang) 

     @if($lang['pivot']['type'] ==='native' AND $lang['pivot']['language_id'] ===$learn['language_id']) 

      <tr> 
       <td>{{$user->firstname}} </td> 
       <td>{{$user->lastname}} </td> 
       <td>{{$user->email}} </td> 
       <td>{{$user->photo}} </td> 
       <td>{{$user->bio}} </td> 
       <td>{{$user['universities']->university}} </td> 
       <td>{{$user['departments']->department}} </td> 
       <td>{{$user['years']->year}} </td> 

       <td> 
        @foreach($user->languages as $lang) 
         @if($lang['pivot']['type'] === 'native') 
          {{$lang["language"]}} 
         @endif 
        @endforeach 
       </td> 

       <td> 
        @foreach($user->languages as $lang) 
         @if($lang['pivot']['type'] === 'learn') 
          {{$lang["language"]}} 
         @endif 
        @endforeach 
       </td> 

       <td> 
        @foreach($user->hobbies as $hobby) 
         {{$hobby->hobby}} <br> 
        @endforeach 
       </td> 
      </tr> 
     @endif 
    @endforeach 
@endforeach 

Ich bin nicht in der Lage zwei, wenn die Bedingungen eines für die Überprüfung Muttersprache und eine setzen für die Sprache lernen zu überprüfen. wenn ich das mag:

@if($lang['pivot']['type'] ==='native' AND $lang['pivot']['language_id'] ===$learn['language_id']) 
@if($lang['pivot']['type'] ==='learn' AND $lang['pivot']['language_id'] ===$native['language_id']) 

Ich bekomme keine Zeilen, während Benutzer existieren mit einer Übereinstimmung.

Ich denke, weil ich zwei Pivot-Typ lernen und nativ in einem Array haben.Wie vergleicht man sowohl Lernen als auch Muttersprache? unten gezeigtes Sprachenformat. seine vielen zu vielen Beziehung

"languages":[ 
    { 
     "id":3, 
     "language":"Spanish", 
     "pivot":{ 
     "user_id":2, 
     "language_id":3, 
     "type":"native" 
     } 
    }, 
    { 
     "id":4, 
     "language":"Greek", 
     "pivot":{ 
     "user_id":2, 
     "language_id":4, 
     "type":"learn" 
     } 
    } 
] 
+0

Nur um zu überprüfen, möchten Sie nur eine Liste von anderen Benutzern anzeigen, die lernen möchten, Auth :: user() ''s Muttersprache ** und ** ihre Muttersprache ist eine, die die' Auth: : user() will lernen? –

+0

@RossWilson Ja. Korrekt –

+0

Auch bin ich richtig in der Annahme, dass ein Benutzer mehr als eine Sprache lernen möchte? –

Antwort

1

Statt Schleife durch alle Nutzer in der Datenbank, die Sie gerade Ihre Abfrage einschränken könnte:

$native = Auth::user()->languages()->wherePivot('type', 'native')->first(); 

$learn = Auth::user()->languages()->wherePivot('type', 'learn')->first(); 

$other_users = User::with('departments', 'hobbies', 'universities', 'years', 'languages') 
    ->where('id', '<>', Auth::user()->id) 
    ->where('role', '<>', 2) 
    ->whereHas('languages', function ($query) use ($learn) { 
     $query->where('type', 'native')->where('id', $learn->id); 
    }) 
    ->whereHas('languages', function ($query) use ($native) { 
     $query->where('type', 'learn')->where('id', $native->id); 
    }) 
    ->get(); 

Auch nur ein FYI, $lang['pivot']['type'] auch geschrieben werden kann:

Abschnitt
$lang->pivot->type; 

Ihre Klinge könnte dann etwas wie folgt aussehen:

@foreach($other_users as $user) 

    <tr> 
     <td>{{ $user->firstname }} </td> 
     <td>{{ $user->lastname }} </td> 
     <td>{{ $user->email }} </td> 
     <td>{{ $user->photo }} </td> 
     <td>{{ $user->bio }} </td> 
     <td>{{ $user->universities->university }} </td> 
     <td>{{ $user->departments->department }} </td> 
     <td>{{ $user->years->year }} </td> 
     <td> 
      {{ $user->languages->where('pivot.type', 'learn')->first()->language }} 
     </td> 
     <td> 
      {{ $user->languages->where('pivot.type', 'native')->first()->language }} 
     </td> 
     <td> 
      {!! $user->hobbies->pluck('hobby')->implode('<br>') !!} 
     </td> 
    </tr> 
@endforeach 

Hoffe, das hilft!

+0

Danke für die Lösung. Ich habe eine Frage, wie man diese viel effiziente Art und Weise umschreiben kann, Sie haben Recht, keine Notwendigkeit zu Schleife, aber wenn ich $ Benutzer-> Sprachen-> Pivot-> Typ === 'native' mache ich Fehler, die Sprachen unbekannt. Stattdessen mache ich: \ @foreach ($ user-> languages ​​as $ lang) \t \t \ @if ($ lang-> pivot-> type === 'nativ') \t \t {{$ lang-> language }} \t \t \ @endif \t \t \ @endforeach –

+0

@MurlidharFichadia ich habe ein Beispiel hinzugefügt, wie Sie Ihre Klinge foreach umschreiben könnte. –