Я пытаюсь извлекать сообщения из базы данных в larvavel (немного застрял)

#php #mysql #database #laravel #controller

#php #mysql — сервер #База данных #ларавель #контроллер #mysql #laravel

Вопрос:

Я пытаюсь создать приложение для чата в laravel. Я пытаюсь получить сообщения один к одному.

Вот мой контролер:-

 public function user( $id) {

        $chat = User::find($id);
        

        $table = DB::table('messages')
        ->where('sender', Auth::user()->id, 'amp;amp;', 'reciever', $id)
        ->orWhere('sender', $id, 'amp;amp;', 'reciever', Auth::user()->id)
        ->get();

        return view('user', compact('chat', 'id', 'table'));
   } 
  

Миграция моих сообщений:-

 public function up()
    {
        Schema::create('messages', function (Blueprint $table) {
            $table->id();
            $table->integer('sender')->unsigned();
            $table->integer('reciever')->unsigned();
            $table->text('message');
            $table->timestamps();
        });
    }
  

Вот маршрут:- Route::get('/user/{id}', 'ContactsController@user');

Это ошибка, которую я получаю:-
SQLSTATE[HY000]: General error: 1 near ""sender"": syntax error (SQL: select * from "messages" where reciever "sender" = 30 "sender" = 1)

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

Ответ №1:

Пожалуйста, смотрите https://laravel.com/docs/7.x/queries#parameter-grouping для получения информации о группировках запросов. Вам нужно отделить свою логику следующим образом

 $table = DB::table('messages')
    ->where(function($query) use ($id) { // Where (sender = User AND receiver = id)
           $query->where('sender', Auth::user()->id)
                ->where('reciever', $id);
        })
    ->orWhere(function($query) use ($id) { // OR (sender = id AND receiver = User)
           $query->where('sender', $id)
                ->where('reciever', Auth::user()->id);
    })
    ->get();
  

Комментарии:

1.это приводит к тому, что IlluminateSupportCollection {#281 ▼ #items: [] } но я также проверяю доки, но не могли бы вы сказать мне, что делает эта «функция» в orWhere

2. Функция вызывается замыканием . Передача замыканий в where / orWhere создает группы запросов, которые нужны базам данных для отсечения логики предложения where при смешивании И / ИЛИ подобных этому.

Ответ №2:

Проблема в вашем where() и orWhere()

 ->where('sender', Auth::user()->id, 'amp;amp;', 'reciever', $id)
        ->orWhere('sender', $id, 'amp;amp;', 'reciever', Auth::user()->id)
  

Что вы должны сделать вместо этого:

 ->where([
    ['sender', Auth::user()->id],
    ['reciever', $id],
])->orWhere([
    ['sender', $id],
    ['reciever', Auth::user()->id],
])
  

Я предлагаю прочитать документы Laravel Where с предложениями, прежде чем углубляться.

Комментарии:

1. В результате получается пустой массив, но я хорошо проверю документы

2. Убедитесь, что ожидаемый sql-запрос был выполнен, и убедитесь, что ожидаемые записи находятся в базе данных

Ответ №3:

Это сработало для меня:-

 $messages = Message::where('sender', $id)->orWhere('reciever', $id)->get();
    $messages = Message::where(function($q) use ($id) {
        $q->where('sender', auth()->id());
        $q->where('reciever', $id);
    })->orWhere(function($q) use ($id){

        $q->where('sender', $id);
        $q->where('reciever', auth()->id());
    })
    ->get();