在Laravel查询构建器中运行“exists”查询

时间:2014-11-16 04:45:25

标签: laravel laravel-4 query-builder

我使用MySQL并拥有一个包含900万行的表,并希望快速检查是否存在记录(id)。

根据一些研究,似乎最快的方法是以下sql:

SELECT EXISTS(SELECT 1 FROM table1 WHERE id = 100)

来源:Best way to test if a row exists in a MySQL table

如何使用Laravel的查询构建器编写此内容?

3 个答案:

答案 0 :(得分:5)

使用selectOne类的Connection方法:

$resultObj = DB::selectOne('select exists(select 1 from your_table where id=some_id) as `exists`');

$resultObj->exists; //  0 / 1;

答案 1 :(得分:3)

http://laravel.com/docs/4.2/queries

向下滚动到Exists Statements,您将获得所需

DB::table('users')
->whereExists(function($query)
{
    $query->select(DB::raw(1))
          ->from('table1')
          ->whereRaw("id = '100'");
})
->get();

答案 2 :(得分:2)

这是一个已经回答的旧问题,但我会发表我的意见 - 也许它会帮助有人在路上。

mysql documentation所示,EXISTS仍将执行提供的子查询。当您需要将EXISTS作为更大查询的一部分时,使用EXISTS非常有用。但是,如果您只是想从Laravel应用程序检查记录是否存在,Eloquent提供了更简单的方法:

DB::table('table_name')->where('field_name', 'value')->exists();

这将执行类似

的查询
select count(*) as aggregate from `table_name` where `field_name` = 'value' limit 1
// this is kinda the same as your subquery for EXISTS

并将评估结果并返回true / false,具体取决于记录是否存在。

对我而言,这种方式也比接受的答案更清晰,因为它不使用原始查询。

更新

在laravel 5中,现在将执行相同的语句

select exists(select * from `table_name` where `field_name` = 'value')

究竟是什么,要求的是什么。