2017-05-17 37 views
0

我有一个表,我正在运行搜索。富。我想检查搜索词是否像表中的一堆不同的字段。但我希望结果被强制为“积极”。如何强制拉拉维尔集合的where子句5

我使用Laravel 5.0

$foos = DB::table('foo') 
     ->where('name', 'LIKE', '%' . $query . '%') 
     ->orWhere('description', 'LIKE', '%' . $query . '%') 
     ->orWhere('address_city', 'LIKE', '%' . $query . '%') 
     ->orWhere('short_description', 'LIKE', '%' . $query . '%') 
     ->orWhere('interview', 'LIKE', '%' . $query . '%') 
     ->get(); 

    $foos = $foos->where('active', true)->get(); 
+1

把' - >在哪里( '主动',真)'之前,你的第一个'where'不起作用? –

+0

就是这样。谢谢 –

+0

对我来说似乎很奇怪,你希望在返回的'Collection'上有一个where子句,而不是在数据库查询中增加另一个where子句。 –

回答

0

收藏有类似查询构建器中where方法。

$activeFoos = $foos->where('active', true); 

https://laravel.com/docs/5.4/collections#method-where

编辑: 我明白你现在从注释需要。尝试下面的代码,并且还请注意,我将您的原始$查询更改为$ find。所以记住这一点。

$foos = DB::table('foo') 
    ->where('active', true) 
    ->where(function ($query) use ($find) { 
     $query->where('name', 'LIKE', "%{$find}%") 
      ->orWhere('description', 'LIKE', "%{$find}%") 
      ->orWhere('address_city', 'LIKE', "%{$find}%") 
      ->orWhere('short_description', 'LIKE', "%{$find}%") 
      ->orWhere('interview', 'LIKE', "%{$find}%"); 
    }) 
    ->get(); 
+0

如果你看那是我正在尝试,它会返回一个错误 –

+0

你可以看到我已经删除了 - > get()'? – Sandeesh

+0

我正在使用laravel 5.0 –

0

active实际真或只是truthy的值(例如1-3的整数)?

对于宽松比较,您需要使用whereLoose('active', true),否则Laravel的方法将在Collection中执行严格的类型比较。 ()是一个查询生成器方法,其中()方法返回一个新的集合而不是一个生成器实例,因此需要移除get()。

+0

该值实际上是一个int:1.但是,如果我将whereActive(1)传递给主查询,它仍会获得一些whereActive = 0。 –

0

你在做什么是错的。您检索一组数据,然后尝试添加一个where claus,然后尝试再次检索它。所以这样做:

$foos = DB::table('foo') 
     ->where('name', 'LIKE', '%' . $query . '%') 
     ->orWhere('description', 'LIKE', '%' . $query . '%') 
     ->orWhere('address_city', 'LIKE', '%' . $query . '%') 
     ->orWhere('short_description', 'LIKE', '%' . $query . '%') 
     ->orWhere('interview', 'LIKE', '%' . $query . '%') 
     ->where('active', true)->get(); 

或者做

$foos = array_where($foos, function ($value, $key) { 
    return isset($value['active']) && (bool) $value['active']; 
});