2017-02-07 14 views
1

У меня есть пользователь, который говорит на родном языке позволяет говорить английский и хочет выучить французский.Поиск спичку профиля пользователя в Laravel 5.3

Как я могу найти список матча, где пользователи натива французского и хочет выучить английский. Его программа обмена языками, поэтому я хотел бы указать пользователей с совпадением.

У меня есть пользователь, Language_User и Language table. в таблице Language_User У меня есть дополнительное поле типа type (learn или native).

Пользователи

идентификатор

имя

...

Language_User

ID

user_id

LANGUAGE_ID

типа ('учиться', 'родной')

Язык

ID

язык

запросов

Во-первых, я получаю все пользователи, которые не играть роль «админ» или не он сам.

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

Тогда я получаю LoggedIn пользователей $ выучить язык и $ родной язык для сравнения с другими пользователями

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

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

В видовом

дает LoggedIn язык пользователя, чтобы узнать

{{$learn->language_id}} 

дает loggedin собственный родной язык

{{$native->language_id}} 

View Code

@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 

Я не могу поставить два если условия один для проверки родного языка и один для проверки выучить язык. если мне это нравится:

@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']) 

У меня нет строк, в то время как пользователь существует с совпадением.

Я думаю, потому что у меня есть два типа поворота, которые учатся и являются родными в массиве.как сравнивать и учиться, и родной? ниже отображаемых языков. его многие ко многим отношению

"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

Чтобы просто проверить, просто вы хотите показать список других пользователей, которые хотят изучить родной язык 'Auth :: user()' ** и ** их родной язык является тем, что 'Auth: : user() 'хотите узнать? –

+0

@ RossWilson Да. правильно –

+0

Кроме того, могу ли я предположить, что пользователь может захотеть узнать больше одного языка? –

ответ

1

Вместо проходным всех пользователей в базе данных вы можете просто сдерживало запрос:

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

Кроме того, просто FYI, $lang['pivot']['type'] также может быть записана в виде:

$lang->pivot->type; 

Ваш раздел лезвие может выглядеть примерно так:

@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 

Надеюсь, это поможет!

+0

Спасибо за решение. У меня есть один вопрос, как переписать этот очень эффективный способ, вы не нуждаетесь в цикле, но если я делаю $ users-> languages-> pivot-> type === 'native', я получаю ошибку, что неизвестные языки. Так что вместо этого я делать: \ @foreach ($ user-> языки, как $ LANG) \t \t \ @if ($ lang-> pivot-> тип === 'родной') \t \t {{$ lang-> язык }} \t \t \ @endif \t \t \ @endforeach –

+0

@MurlidharFichadia Я добавил пример того, как можно переписать лезвие Еогеасп. –