【问题标题】:Laravel 4 : Raw Query to EloquentLaravel 4:Eloquent 的原始查询
【发布时间】:2015-09-17 01:31:03
【问题描述】:

我想将此查询转换为 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" where "who_see" = 6 or "news"."id_user" in (select "id_user" from "koneksi_user" where to_id_user = $user->id_user) or "news"."id_user" in (从“koneksi_user”中选择“id_user”,其中 id_user = $user->id_user))

我该如何解决这个问题?

【问题讨论】:

  • 所以你只是想得到解决方案?向我们展示您迄今为止的尝试。
  • return \Status::with('likes') ->with('user.profil.foto') ->with('foto') ->with('cmets.owner.profil. foto') ->with('cmets.like') //->where('who_see', [6,$user->id_user_group]) ->orWhereIn('who_see', [6,$user->id_user_group] ) ->orWhereIn('news.id_user',"array([select id_user from koneksi_user where to_id_user=$user->id_user and confirm='0'])") ->orderBy('created_at', 'desc') - >分页(20);
  • 我投票决定将此问题作为题外话结束,因为这个问题属于“gimme hte codez”类型。
  • 我只是想问,因为我很麻烦,但是为什么我收到的回复是这样的?是否像我这样的初学者要问?如果这个话题确实会提前结束。
  • 由于您的问题表述不正确,您最初得到的答复过于苛刻。你刚刚提出了一个查询并要求它提供 Eloquent 代码,这看起来就像你在寻求解决方案。下次包括你从一开始就尝试过的代码,以及对问题的解释,你不会得到不好的回复。您还应该阅读帮助中心的Asking Section,了解如何在 StackOverflow 上以正确的方式提问。

标签: laravel eloquent


【解决方案1】:

我可以看到的主要问题(这也是错误消息中报告的问题)是这样的:

->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() 调用,看看是否有帮助。

【讨论】:

    【解决方案2】:

    你几乎让它工作了。代码的问题是您尝试将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 查询的完整查询构建器代码应如下所示:

    \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]);
    

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 2015-02-13
      • 2019-04-27
      • 2015-04-09
      • 2019-04-29
      • 2018-10-31
      • 2021-02-02
      • 2018-10-11
      • 2016-04-27
      相关资源
      最近更新 更多