【问题标题】:Finding a user profile match in laravel 5.3在 laravel 5.3 中查找用户配置文件匹配
【发布时间】:2017-02-07 12:45:00
【问题描述】:

我有一个说母语的用户说英语并想学习法语

如何找到用户母语是法语并希望学习英语的匹配列表。 它是一个语言交换计划,所以我想列出匹配的用户。

我有用户、语言用户和语言表。在 Language_User 表中,我有一个名为 type(learn 或 native) 的额外字段。

用户

身份证

名字

...

Language_User

身份证

user_id

language_id

type('learn','native')

语言

身份证

语言

查询

首先,我获取所有不具有“管理员”角色或不是他/她本人的用户。

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

然后,我让登录用户 $learn 语言和 $native 语言与其他用户进行比较

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

我没有得到任何行,而用户确实存在匹配。

我想是因为我在一个数组中有两个枢轴类型 learn 和 native。如何比较学习和本地?下面显示的语言格式。它的多对多关系

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

【问题讨论】:

  • 只是为了仔细检查,您只想显示一个想要学习 Auth::user() 母语的其他用户的列表并且他们的母语是Auth::user()想学吗?
  • @RossWilson 是的。正确
  • 另外,我是否正确假设用户可以想学习不止一种语言?
  • @RossWilson 不,一个人可以学习或教授的语言数量必须正好是一种。但是在寻找匹配的用户时。可能会有用户列表,因为如果我想学习法语和教英语,可能会有 100 多个个人资料想要我的偏好,反之亦然。

标签: php laravel-5 eloquent laravel-5.3 querying


【解决方案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

希望这会有所帮助!

【讨论】:

  • 感谢您的解决方案。我有一个问题,如何重写这种高效的方式,你不需要循环,但如果我这样做 $users->languages->pivot->type === 'native' 我会收到语言未知的错误。所以我改为: \@foreach($user->languages as $lang) \@if($lang->pivot->type ==='native') {{$lang->language}} \@endif \ @endforeach
  • @MurlidharFichadia 我添加了一个示例,说明如何重写刀片 foreach。
猜你喜欢
  • 2013-12-05
  • 1970-01-01
  • 2022-01-07
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多