我想将此查询转换为Eloquent:
SELECT *
FROM news
WHERE who_see='6'
OR (news.id_user IN
(SELECT id_user
FROM koneksi_user
WHERE to_id_user='$user->id_user'
AND confirmed='0')
OR news.id_user IN
(SELECT to_id_user
FROM koneksi_user
WHERE id_user='$user->id_user'
AND confirmed='0')))
ORDER BY created_at DESC
到目前为止,我已经尝试过这个:
$user = \Auth::user();
return \DB::table('news')
->where('who_see','6')
->orWhereIn('news.id_user', function($query)
{
$query->select('id_user')
->from('koneksi_user')
->whereRaw('to_id_user = $user->id_user');
})
->orWhereIn('news.id_user', function($query2)
{
$query2->select('id_user')
->from('koneksi_user')
->whereRaw('id_user = $user->id_user');
})
->get();
但是我收到了这个错误:
SQLSTATE [42601]:语法错误:7错误:'sintaks error'pada atau didekat«$»LINE 1:...“id_user”from“koneksi_user”where to_id_user = $ user-> id _... ^ (SQL:select * from“news”,其中“who_see”= 6或“news”。“id_user”in(从“koneksi_user”中选择“id_user”,其中to_id_user = $ user-> id_user)或“news”。“id_user “in(从”koneksi_user“中选择”id_user“,其中id_user = $ user-> id_user))
我该如何解决这个问题?
答案 0 :(得分:0)
我能看到的主要问题(也是错误信息中报告的问题)是:
->whereRaw('to_id_user = $user->id_user')
这将生成类似WHERE to_id_user = $user->id_user
的SQL代码,这是无效的SQL。
第一个问题是你在单引号字符串中有PHP变量。这意味着它们不会被视为变量,只会被视为字符串的一部分;他们不会被解析。
这可以通过将其更改为双引号字符串来解决,但在这种情况下,这不是最好的解决方法,因为我不清楚您为何使用whereRaw()
在这里。看起来您应该只使用where()
:
->where('to_id_user', $user->id_user)
使用whereRaw()
来电替换where()
来电,看看是否有帮助。
答案 1 :(得分:0)
你差不多了。代码的问题在于您尝试将whereRaw
用于两个条件,但在字符串中包含实际变量名称,这意味着:
->whereRaw('to_id_user = $user->id_user');
将创建此SQL条件:
WHERE to_id_user = $user->id_user
所以它只使用文字$user->id_user
字符串而不是实际的ID值。要解决此问题,您只需使用常规where
方法:
->where('to_id_user', $user->id_user);
将生成您正在查找的SQL查询的完整Query Builder代码应如下所示:
\DB::table('news')
->where('who_see', '6')
->orWhereIn('news.id_user', function($query) {
$query->select('id_user')
->from('koneksi_user')
->where('to_id_user', $user->id_user)
->where('confirmed', 0);
})
->orWhereIn('news.id_user', function($query2) {
$query2->select('id_user')
->from('koneksi_user')
->where('id_user', $user->id_user)
->where('confirmed', 0);
})
->orderBy('created_at', 'desc')
->get();
为了将来参考,如果出于任何原因,您希望/需要使用whereRaw
并将变量传递给条件,则应使用绑定来避免SQL Injection:
->whereRaw('to_id_user = ?', [$user->id_user]);