在查询数据库时遇到问题嵌套 - Laravel

问题描述 投票:2回答:1

我在查询数据库时遇到问题。

我的数据库如下:

表订单:

  • 订单号
  • Sekandaraderanambara
  • 删除
  • created_at
  • 用户身份 表用户: 用户名 dealername

我已经建立了从订单到用户的模型关系。

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);放在其他地方
  • $query嵌入其他地方

任何帮助表示赞赏

php mysql laravel laravel-5
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.