Синтаксис запроса к базе данных - PullRequest
1 голос
/ 11 мая 2019

Решение: я использовал db фасад, DB::select() для запуска необработанного SQL-запроса.

У меня есть две таблицы: пользователи (идентификатор, имя пользователя, город, страна) и друзья (идентификатор, идентификатор_пользователя, идентификатор_пользователя, статус). В таблице «users» хранится информация о пользователе, а в таблице «friends» хранится идентификатор пользователя, вошедшего в систему в данный момент, а friend_id - это идентификатор пользователя, который отправил запрос на добавление в друзья текущему пользователю, и статус будет «получен». Я хочу показать информацию о пользователях, отправивших запросы текущему пользователю. Правильный ли синтаксис запроса к моей базе данных? Я могу видеть правильный вывод, если я не использую вложенный подзапрос. Заранее спасибо!

Мой запрос к БД:

$friendrequests = DB::table('users')->select(['username','city','country'])->where('id',DB::table('friends')->select('friend_id')->where([['status','received'],['user_id',$user->id]]));

Мой HTML:

@extends('layouts.master')

@section('title')
    Friend Requests
@endsection

@section('content')
    @include('includes.message-block')
    <section class="row requests">
        <div class="col-md-6 col-md-offset-3">
            <header><h3>Friend Requests</h3></header>
            <div class="requestlist">
                <header><h2>You have request from:</h2></header>
                @foreach($users as $user)
                    <p>Name: {{ $user->username }}<br />City: {{ $user->city }}<br />Country:{{ $user->country }}</p>
                    <div class="interaction">
                        //stuff here
                    </div>
                @endforeach
                <a href="{{ URL::previous() }}">Back</a>
            </div>
        </div>
    </section>
@endsection

Маршрут:

Route::get('/friendrequests',[
        'uses' => 'FriendController@getFriendRequests',
        'as' => 'friendrequests',
        'middleware' => 'auth'
    ]);

Контроллер (работает, если я не использую вложенный подзапрос):

public function getFriendRequests()
    {
        $user = Auth::user();
        $friendrequests = DB::table('users')
        ->select(['username','city','country'])
        ->where('id',
            DB::table('friends')->select('friend_id')->where([['status','received'],['user_id',$user->id]])->get())->get();

        return view('friendrequests',['users' => $friendrequests]);
    }

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Пожалуйста, попробуйте это может быть полезно

$friendrequests = DB::table('users')
    ->select(['username','city','country'])
    ->whereIn('id', function($query) use($user) {
        $query->select('friend_id')
        ->from('friends')
        ->where('status', 'received')
        ->where('user_id', $user->id);
    })->get();
0 голосов
/ 11 мая 2019

Вы можете решить эту проблему с помощью подхода «hasManyThrough». В модели вашего пользователя вы должны сделать что-то вроде этого:

class User extends Model{

  //... your code here

  public function possibleFriends(){
    $this->hasManyThrough(User::class, Friend::class, 'friend_id', 'id')->wherePivot('status', 'received');
  }

}

Подробнее в официальных документах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...