查询数据库时嵌套 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 变量时遇到问题

一文讲懂SQL子查询

在 Firebase 中使用多个 where 子句进行查询

sql的嵌套查询,把一次查询的结果做为表继续进一步查询;内联视图

有一个 mySQL 错误,未知列 where 子句 [重复]