查询数据库时嵌套 where 子句时遇到问题 - Laravel
Posted
技术标签:
【中文标题】查询数据库时嵌套 where 子句时遇到问题 - Laravel【英文标题】:Having problems nesting where clausing when querying the Database - Laravel 【发布时间】:2018-08-14 03:55:21 【问题描述】:我在查询数据库时遇到问题。
我的数据库如下:
餐桌顺序:
订单号 二级订单号 已删除 created_at user_id 表用户: 用户名 经销商名称我已经做好了从订单到用户的模型关系。
public function user()
return $this->hasOne('App\User','id','user_id');
我如何构建我的查询:
$query = Order::query();
$query->where('deleted', 0);
$fields = array('user' => ['username','dealername'], 'ordernumber', 'ordernumber_second');
foreach ($fields as $relation => $field)
if (is_array($field))
$query->whereHas($relation, function ($q) use ($field, $searchquery)
$q->where(function ($q) use ($field, $searchquery)
foreach ($field as $relatedField)
$q->orWhere($relatedField, 'like', "%$searchquery%");
);
);
else
$query->orWhere($field, 'like', "%$searchquery%");
$orders = $query->orderBy('created_at','desc')->get();
// return view ETC
这可行,唯一不可行的是 where 子句:
$query->where('deleted', 0);
工作不正常,即使删除为真,查询也会返回所有记录..
这可能与之前的 orWhere 有关,但我无法弄清楚。
我尝试了什么:
将where('deleted' , 0);
放在其他地方
在 else 中嵌套 $query
感谢任何帮助
【问题讨论】:
您可能希望输出生成的 SQL 以进行调试。 【参考方案1】:起初,我认为更好的关系如下
public function user()
return $this->belongsTo('App\User','user_id');
现在在查询中,您可以将代码重写为
$fields = array('user' => ['username','dealername'], 'ordernumber', 'ordernumber_second');
Order::where(function($query) use ($searchquery, $fields)
foreach ($fields as $relation => $field)
if (is_array($field))
$query->whereHas($relation, function ($q) use ($field, $searchquery)
$q->where(function ($q) use ($field, $searchquery)
foreach ($field as $relatedField)
$q->orWhere($relatedField, 'like', "%$searchquery%");
);
);
else
$query->orWhere($field, 'like', "%$searchquery%");
)->where('deleted', 0)
【讨论】:
同样默认情况下,如果您使用软删除,列名将是deleted_at
以上是关于查询数据库时嵌套 where 子句时遇到问题 - Laravel的主要内容,如果未能解决你的问题,请参考以下文章
与where子句查询的Eloquent嵌套关系在false条件下返回集合
在 where 子句中使用 Oracle SQL 变量时遇到问题