简体   繁体   中英

SQL exists in Laravel 5 query builder

Good morning,

I've been trying for quite a lot of time to translate this query(which returns an array of stdClass) into query builder so I could get objects back as Eloquent models.

This is how the query looks like untranslated:

$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,
                ));

I have tried this, but it gives a syntax error near the inner from in the subquery:

$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();

The problem is this exists and a subquery in it. I couldn't find anything regarding this special case.

Assume each table has an appropriate Eloquent model. V_anketa is a view. The db is postgresql.

As far as the query goes I believe this should work:

$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();

but I'm not clear on what do you mean by "assuming every table has an Eloquent model" and "V_anketa" is a view...

Assuming the SQL query is correct, this should work:

$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));

If you want to get back an Builder instance you need to specify the table:

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

If you however, want to get an Eloquent Model instance, for example to use relations, you need to use Eloquent .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM