Laravel 4:对Eloquent的原始查询

时间:2015-09-17 01:31:03

标签: laravel eloquent

我想将此查询转换为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))

我该如何解决这个问题?

2 个答案:

答案 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]);