我正在尝试从 laravel 中的数据库中获取消息(有点卡住)

I am trying to fetch messages from databse in larvavel (little stuck)

我打算在 laravel 中制作一个聊天应用程序。我正在尝试获取一对一消息。

这是我的控制器:-

public function user( $id) {

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

        $table = DB::table('messages')
        ->where('sender', Auth::user()->id, '&&', 'reciever', $id)
        ->orWhere('sender', $id, '&&', '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)


我觉得我的逻辑有问题,谁能指导我。

有关查询分组的信息,请参阅 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();

问题出在您的 where()orWhere()

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

你应该怎么做:

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

我建议在深入研究之前先阅读 Laravel Where Clauses 文档。

这对我有用:-

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