代码之家  ›  专栏  ›  技术社区  ›  Mathieu Mourareau

在两个参数之间搜索自定义查询

  •  0
  • Mathieu Mourareau  · 技术社区  · 7 年前

    在两个参数(date\u min&date\u max)之间进行搜索时,我想运行的查询有问题。

    在我的控制器中,我使用一个过滤器在不同的参数中进行搜索,并添加了一个orWhere条件来选择两个日期之间的结果,但查询结果非常奇怪:

    完整性约束冲突:其中1052列“created\u at” 子句不明确

    连接->runQueryCallback('选择count(*)作为聚合 indemnites 左连接 structures 在…上 构筑物 id = 赔偿金 club_id 哪里 俱乐部id =?或 赔偿金 created_at 之间和和 已在创建\u =?或 赔偿金 已在创建\u 之间和和 已在创建\u =?或 赔偿金 已在创建\u 之间和和 total !=?分组依据 俱乐部id '阵列('6','2018-03-12','2018-03-31','12-03-2018', “2018-03-12”、“2018-03-31”、“31-03-2018”、“2018-03-12”、“2018-03-31”, 0),对象(闭包))

    这是我的控制器:

    公共功能索引(请求$请求){

    $structure = Structure::select('num_structure', 'nom_structure' , 'id')
        ->where('type_structure_id' , '4')
        ->get()
        ->mapWithKeys(function($i) {
            return [$i->id => $i->num_structure.' - '.$i->nom_structure];
        });
    
    $query = Indemnites::query();
    
    $filters = [
        'structure' => 'club_id',
        'dt_min' =>'created_at',
        'dt_max' =>'created_at',
    ];
    
    
    $dt_min = $request->input('dt_min');
    $dt_min = Carbon::parse($dt_min)->format('Y-m-d');
    $dt_max = $request->input('dt_max');
    $dt_max = Carbon::parse($dt_max)->format('Y-m-d');
    
    
    foreach ($filters as $key => $column) {
    
    
        $query->when($request->has($key), function ($query) use ($column,$key, $request , $dt_min , $dt_max)  {
            $query->where($column, $request->$key)
                ->orWhereBetween('rencontre.created_at' , [$dt_min , $dt_max]);
    
        });
    }
    
    $indemnites = $query->leftJoin('structures' , 'structures.id' , '=' ,  'indemnites.club_id')
        ->leftJoin('rencontre' , 'rencontre.id' , '=' , 'indemnites.rencontre_id')
        ->where('total' , '!=' , 0)
        ->selectRaw('sum(total) as total , structures.nom_structure as club , club_id')
        ->groupBy('club_id')->paginate(20);
    
    dd($indemnites);
    

    我哪里做错了?希望有人能帮我

    问题似乎来自生成结果的最后一个查询

    当我更改为$补偿=$查询->分页(20);这是可行的,但我需要在一个原始的。。希望有人能帮忙

    已解决(我在列名上出错)

     public function index(Request $request){
    
            $structure = Structure::select('num_structure', 'nom_structure' , 'id')
                ->where('type_structure_id' , '4')
                ->get()
                ->mapWithKeys(function($i) {
                    return [$i->id => $i->num_structure.' - '.$i->nom_structure];
                });
    
            $query = Indemnites::query();
    
            $filters = [
                'structure' => 'club_id',
                'dt_min' =>'dt_rencontre',
                'dt_max' =>'dt_rencontre',
            ];
    
    
            $dt_min = $request->input('dt_min');
            $dt_min = Carbon::parse($dt_min)->format('Y-m-d');
            $dt_max = $request->input('dt_max');
            $dt_max = Carbon::parse($dt_max)->format('Y-m-d');
    
    
            foreach ($filters as $key => $column) {
    
    
                $query->when($request->has($key), function ($query) use ($column,$key, $request , $dt_min , $dt_max)  {
                    $query->where($column, $request->$key)
                        ->orWhereBetween('rencontre.dt_rencontre' , [$dt_min , $dt_max]);
    
                });
            }
    
            $indemnites = $query->leftJoin('structures' , 'structures.id' , '=' ,  'indemnites.club_id')
                ->leftJoin('rencontre' , 'rencontre.id' , '=' , 'indemnites.rencontre_id')
                ->where('total' , '!=' , 0)
                ->selectRaw('sum(total) as total , structures.nom_structure as club , club_id , rencontre.dt_rencontre')
                //->orWhereBetween('created_at' , [$dt_min , $dt_max])
                ->groupBy('club_id')->paginate(20);
    
    
    
    
            return view('indemnites/index' , compact('indemnites' , 'structure'));
    
        }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   FULL STACK DEV    7 年前

    您拥有关系的表都有 created_at

        foreach ($filters as $key => $column) {
    
    
            $query->when($request->has($key), function ($query) use ($column,$key, $request , $dt_min , $dt_max)  {
                $query->where($column, $request->$key)
                    ->orWhereBetween('tableName.created_at' , [$dt_min , $dt_max]);
    
            });
        }
    

    可以是这样的

     ->orWhereBetween('structures.created_at' , [$dt_min , $dt_max]);
    

    希望这有帮助