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