我可以在Code Igniter中执行此操作
$this->db->select();
$this->from->('node');
if ($published == true)
{
$this->db->where('published', 'true');
}
if (isset($year))
{
$this->db->where('year >', $year);
}
$this->db->get();
我无法在Laravel中这样做。伙计们,请你帮忙。
答案 0 :(得分:39)
在Fluent中你可以这样做:
$query = DB::table('node');
if ($published == true)
$query->where('published', '=', 1);
if (isset($year))
$query->where('year', '>', $year);
$result = $query->get();
答案 1 :(得分:9)
以下是完成查询的方法:
$year = 2012;
$published = true;
DB::table('node')
->where(function($query) use ($published, $year)
{
if ($published) {
$query->where('published', 'true');
}
if (!empty($year) && is_numeric($year)) {
$query->where('year', '>', $year);
}
})
->get( array('column1','column2') );
要查找更多信息,我建议您阅读Laravel文档中的Fluent和Eloquent。 http://laravel.com/docs/database/fluent
答案 2 :(得分:6)
从Laravel 5.2.27开始,您可以通过编写条件来避免破坏链:
$query = DB::table('node')
->when($published, function ($q) use ($published) {
return $q->where('published', 1);
})
->when($year, function($q) use ($year) {
return $q->where('year', '>', $year);
})
->get();
要使用Eloquent,只需将$query = DB::table('node')
与Node::
交换,但要意识到如果两个条件都失败,除非在查询数据库/模型之前检查其他条件,否则您将获得表中的所有内容。来自查询本身。
请注意,$published
和$year
必须在本地范围内才能被闭包使用。
通过创建宏,您可以使其更简洁,更易读。请参阅:Conditionally adding instructions to Laravel's query builder
答案 3 :(得分:4)
如果您需要使用Eloquent,您可以使用它,我不确定whereNotNull是最好的用途,但我找不到另一种方法来返回我们真正想要的空查询实例:
$query = Model::whereNotNull('someColumn');
if(x < y)
{
$query->where('column1', 'LIKE', '%'. $a .'%');
}else{
$query->where('column2', 'LIKE', '%'. $b .'%');
}
$results = $query->get();
这样任何关系仍然有效,例如在您的视图中,您仍然可以使用
foreach($results as $result){
echo $result->someRelationship()->someValue;
}
这里有关于此类内容的大量信息http://daylerees.com/codebright/eloquent-queries。
答案 4 :(得分:1)
您可以在条件中使用Model::when()
,也可以创建Builder::micro()
例如
$results = Model::where('user_id', Auth::id())
->when($request->customer_id, function($query) use ($request){
return $query->where('customer_id', $request->customer_id);
})
->get();
如果您需要为条件创建微观,那么。按照以下说明进行操作。
在您的服务器提供商中编写代码
Builder::macro('if', function ($condition, $column, $operator, $value) {
if ($condition) {
return $this->where($column, $operator, $value);
}
return $this;
});
使用类似示例
$results = Model::where('user_id', Auth::id())
->if($request->customer_id, 'customer_id', '=', $request->customer_id)
->get();
参考:themsaid
答案 5 :(得分:1)
我在这里没有看到它。您甚至可以像这样开始查询
dbutils.fs.mount
,然后链接其他查询命令。也许对新人会有所帮助。
答案 6 :(得分:0)
用于雄辩查询我使用以下仅在条件具有值
的情况下执行->where(function($query) use ($value_id)
{
if ( ! is_null($value_id))
$query->where('vehicle_details.transport_type_id', $value_id);
})
答案 7 :(得分:0)
我们可以这样写(更精确的方式):
$query = DB::table('node')->when($published, function ($q, $published) {
return $q->where('published', 1);
})->when($year, function($q, $year) {
return $q->where('year', '>', $year);
})->get()
Laravel文档中未提及。这是拉request。
答案 8 :(得分:0)
在Laravel> 5.2中,您可以使用when()
:
$results = DB::table('orders')
->where('branch_id', Auth::user()->branch_id)
->when($request->customer_id, function($query) use ($request){
return $query->where('customer_id', $request->customer_id);
})
->get();
文档:https://laravel.com/api/5.8/Illuminate/Contracts/Container/Container.html#method_when
博客文章:https://themsaid.com/laravel-query-conditions-20160425/