使用Query Builder构建动态laravel数据库查询

时间:2015-09-28 02:44:28

标签: php mysql laravel laravel-5

我有一个在Laravel框架上运行的跟踪系统。跟踪系统允许用户使用JSON格式的结构从网站输入他们的跟踪查询,然后将其传递到服务器进行处理。然后,服务器将根据输入中给出的JSON结构查询数据库中的所有相关数据。当前的代码结构有点多余,如下所示:

if($a == true)
{
    $data = DB::table('table')
    ->select('item1')
    ->where('item2', '=', $a)
    ->get();

    if($limit !== null)
    {
        $data = DB::table('table')
        ->select('item1')
        ->where('item2', '=', $a)
        ->take($limit)
        ->get();            
    }       
}
/*the code goes on and on*/

注意在上面的示例代码中,有什么办法可以减少代码的冗余部分吗?就像在我脑海里说的那样:

public function process()
{
    $data = DB::table('table')
    ->select('item1')
    $a == true ? "->where('item2', '=', $a)" : '';
    $limit !== null ? "->take($limit)" : '';
    ->get();
}

因此,您可以看到缩短的代码与长版本完全相同。我理解我的想法在真实场景中无法使用,但有没有类似的方法可以像我想的那样工作?

提前致谢

2 个答案:

答案 0 :(得分:1)

构建器构建查询,但在运行get方法之前不会获取数据。尝试:

if($a == true)
{
    $query = DB::table('table')
    ->select('item1')
    ->where('item2', '=', $a);

    if($limit !== null)
    {
         $query->limit($limit);   
    }

    $data = $query->get();
}

limittake相同。这只是一个别名。

答案 1 :(得分:0)

我通常用它做什么

$query = \DB::table('table');
$query->select('item1');   //i prefer $query->select(\DB::raw('table.item1 AS item1'));
if($a)
{
    $query->where('item2', '=', $a);
}

if($limit)
{
    $query->take($limit);
}

$data = $query->get();

通过这种方式,您可以根据要添加的查询的其他过滤器进行调整。