【问题标题】:Having problems nesting where clausing when querying the Database - Laravel查询数据库时嵌套 where 子句时遇到问题 - 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 以进行调试。

标签: php mysql laravel laravel-5


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 2016-11-23
相关资源
最近更新 更多