【问题标题】:SQL exists in Laravel 5 query builderLaravel 5 查询生成器中存在 SQL
【发布时间】:2015-11-12 07:44:50
【问题描述】:

早上好,

我一直在尝试将这个查询(返回 stdClass 的数组)转换为查询构建器,以便我可以将对象作为 Eloquent 模型返回。

查询看起来像未翻译:

$anketa = DB::select( DB::raw("SELECT * 
                                         FROM v_anketa a 
                                        WHERE not exists (select 1 from user_poeni where anketa_id=a.id and user_id = :lv_id_user)
                                        Order by redni_broj limit 1"
                                     ), array(   'lv_id_user' => $id_user,
                ));

我已经尝试过了,但是它在子查询的内部附近给出了语法错误:

$anketa = V_anketa::selectRaw("WHERE not exists (select 1 from user_poeni where anketa_id=a.id and user_id = :lv_id_user)", array('lv_id_user' => $id_user,)
                            )->orderBy('redni_broj')->take(1)->first();

问题是它存在并且其中有一个子查询。我找不到任何关于这种特殊情况的信息。

假设每个表都有一个合适的 Eloquent 模型。 V_anketa 是一个视图。数据库是 postgresql。

【问题讨论】:

    标签: php postgresql laravel


    【解决方案1】:

    就查询而言,我相信这应该有效:

    $anketa = V_anketa::whereNotExists(function ($query) use ($id_user) {
                    $query->select(DB::raw(1))
                          ->from('user_poeni')
                          ->where('anketa.id', '=', 'a.id')
                          ->where('user_id', '=', $id_user);
                })
               ->orderBy('redni_broj')
               ->first();
    

    但我不清楚“假设每个表都有一个 Eloquent 模型”和“V_anketa”是一个视图是什么意思...

    【讨论】:

    • 这正是我所需要的。我是自己做的,我会接受你的回答。
    • 这只是添加的信息。例如,表 user_poeni 有一个 Eloquent 模型名称 UserPoeni 等。我添加了有关 V_anketa 的信息,因为它本身指向一个视图而不是一个表。我对 Laravel 还是很陌生,所以我认为那里可能会有一些不同。
    【解决方案2】:

    假设 SQL 查询是正确的,这应该可以工作:

    $anketa = DB::select(sprintf('SELECT * FROM v_anketa a WHERE NOT EXISTS (SELECT 1 FROM user_poeni WHERE anketa_id = a.id AND user_id = %s) ORDER  BY redni_broj LIMIT 1', $id_user));
    

    如果您想取回Builder 实例,您需要指定表:

    $anketa = DB::table('')->select('');
    

    但是,如果您想要获取 Eloquent Model 实例,例如使用关系,则需要使用 Eloquent

    【讨论】:

    • 这仍然返回一个 stdClass 对象数组,而不是 eloquent 模型。
    • 什么意思?这不会返回“雄辩模型”(我假设您的意思是雄辩的实例),因为您没有使用 Eloquent,而是使用查询构建器?
    • 我可能没有正确表达这个问题,我的错误。我想要一些类似我尝试的东西,即 V_anketa::something 这会给我 V_anketa 类型的结果,而不是 stdClass 的数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2016-02-04
    • 2015-12-21
    • 2016-02-04
    • 2020-06-20
    • 2021-08-07
    • 1970-01-01
    相关资源
    最近更新 更多