我的資料庫中有一個名為“訊息”的表,基本列是message_from,message_to, message. 我需要列出向我發送訊息的其他用戶或我向誰發送訊息。我正在嘗試在 Laravel 中轉換原始 PHP 查詢。
原始查詢:
$user_id = 'my_user_id';
Select Distinct case when message_from = '$user_id' then message_to else message_from end as
contact from messages where '$user_id' in (message_from, message_to) ORDER BY id DESC
我對 Laravel 的轉換:
$user_id = Auth::user()->user_id;
$messages = DB::table('messages')
->selectRaw("(SELECT DISTINCT CASE WHEN message_from = '$user_id' THEN message_to
ELSE message_from END as messages FROM messages WHERE '$user_id' IN
(message_from,message_to)")
->latest()
->get();
但不幸的是,它不起作用。我收到此錯誤:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right syntax to use near
'from `messages` order by `created_at` desc' at line 1 (SQL: select (SELECT DISTINCT CASE WHEN
message_from = 'client-20220215L0pu1xDTy9S3SKf8055449' THEN message_to ELSE message_from END as
messages WHERE 'client-20220215L0pu1xDTy9S3SKf8055449' IN (message_from,message_to) from
`messages` order by `created_at` desc)
uj5u.com熱心網友回復:
當前查詢中的問題是您在select查詢構建器的一部分中猛烈抨擊整個查詢,這將不起作用,因為 Laravel 將嘗試圍繞它構建查詢的其余部分,因此看起來SELECT (SELECT CASE...FROM...WHERE) FROM ...顯然不是您想要的查詢它執行。
您的查詢看起來會更好:
DB::table('messages')
->selectRaw("CASE WHEN message_from = ? THEN message_to
ELSE message_from END as messages", [ $user_id ])
->where('message_from', $user_id)
->orWhere('message_to', $user_id)
->latest()
->distinct()
->get();
請注意,我將 更改WHERE $user_id IN (message_from, message_to)為WHERE message_from = $user_id OR message_to = $user_id因為其他語法也只能使用原始查詢來完成。
還要注意使用的引數,selectRaw而不是注入可能是危險的 user_id 的引數(取決于背景關系,不清楚是$user_id直接還是間接來自用戶輸入)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/439802.html
