Поиск соответствия профиля пользователя в laravel 5.3

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

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

У меня есть пользователи, Language_User и языковая таблица. в таблице Language_User у меня есть дополнительное поле с именем type(учиться или родной).

пользователей

Я бы

название

...

Language_User

Я бы

Идентификатор пользователя

LANGUAGE_ID

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

язык

Я бы

язык

Запросы

Сначала я получаю всех пользователей, которые не имеют роли "Администратор" или не являются его / ее.

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

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

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

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

Ввиду

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

{{$learn->language_id}}  

дает залогиненный пользовательский родной язык

{{$native->language_id}}

Посмотреть код

@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"
      }
   }
]

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

Кроме того, просто к вашему сведению, $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

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

Другие вопросы по тегам