【问题标题】:where clause is ambiguous on a querywhere 子句在查询中不明确
【发布时间】:2018-03-11 15:16:05
【问题描述】:

我构建了一个搜索模块来从不同的参数中获取结果!它可以工作,但是当我何时在 csv 中导出结果时,我的连接表出现问题。例如,当我使用 catg_licence_id 进行搜索时,我会遇到如下异常:

SQLSTATE[23000]:违反完整性约束:1052 列 where 子句中的“catg_licence_id”不明确

我的控制器在这里获取结果并使用连接表生成文件以从其他表中获取值而不是简单的 ids 。希望有人能帮助我。提前非常感谢:)

public function exportLicencesExcelWithParam(Request $request){

        $type_licence = Type_licence::pluck('lb_type' , 'id');
        $activite = ActiviteLicencie::pluck('lb_activite' , 'id');
        $catg_licence = CatgLicence::pluck('lb_catg_lic' , 'id');
        $structure = Structure::select('num_structure', 'nom_structure' , 'id')
            ->get()
            ->mapWithKeys(function($i) {
                return [$i->id => $i->num_structure.' - '.$i->nom_structure];
            });


        $query = Licencies::query();

        $filters = [

            'type_licence' => 'type_licence_id',
            'activite_licencie' => 'activite_licencie_id',
            'assurance' => 'lb_assurance_etat',
            'catg_licence' => 'catg_licence_id',
            'structure' => 'structure_id',

        ];


        foreach ($filters as $key => $column) {
            if ($request->has($key)) {
                $query->where($column, $request->{$key});

            }
        }

        $action = Input::get('action', 'none');

        if($action =='send'){

//HERE I WANT TO GENERATE THE CSV FILE BUT I NEED TO GET THE JOIN TABLES TO DISPLAY THE RESULT 

            $licencies = $query->join('activite_licencie', 'activite_licencie.id', '=', 'licencies.activite_licencie_id')
                ->join('saisons', 'saisons.id', '=', 'licencies.saison_id')
                ->join('pays', 'pays.id', '=', 'licencies.pays_naissance_id')
                ->join('type_licence', 'type_licence.id', '=', 'licencies.type_licence_id')
                ->join('structures', 'structures.id', '=', 'licencies.structure_id')
                ->join('civilite', 'civilite.id', '=', 'licencies.civilite_id')
                ->join('catg_licence', 'catg_licence.id', '=', 'licencies.catg_licence_id')
                ->select('num_licence', 'civilite.lb_civilite', 'lb_nom', 'lb_prenom', 'dt_naissance', 'pays.fr as pays', 'activite_licencie.lb_activite', 'catg_licence.lb_catg_lic', 'type_licence.lb_type', 'saisons.lb_saison', 'lb_surclassement', 'structures.nom_structure', 'structures.num_structure', 'lb_assurance', 'cd_dept_naissance', 'lb_ville_naissance', 'lb_adresse', 'tel_fix_licencie', 'tel_port_licencie', 'adresse_email')
                ->get();


            $licencies->map(function ($licencie) {

                $licencie['dt_naissance'] = \Carbon\Carbon::parse($licencie['dt_naissance'])->format('d/m/Y');

                $licencie['lb_nom'] = strtoupper($licencie['lb_nom']);

                $licencie['lb_prenom'] = ucfirst(strtolower($licencie['lb_prenom']));

                if ($licencie['num_structure'] == 662883) {

                    $licencie['lb_activite'] = 'Super League';

                } elseif ($licencie['num_structure'] == 311197) {

                    $licencie['lb_activite'] = 'ChampionShip';


                } else {

                    //do nothing
                }

                if ($licencie['lb_activite'] == 'Tricolore LER' or $licencie['lb_activite'] == 'Tricolore - Autres Divisions') {

                    $licencie['lb_activite'] = 'Tricolore';

                }


                if ($licencie['lb_type'] == 'Membre') {


                    $licencie['lb_catg_lic'] = '';

                }

                return $licencie;

            });

            $date = Carbon::now('Europe/Paris')->format('d-m-Y h:m:s');

            $file = Excel::create('' . $date . '', function ($excel) use ($licencies) {
                $excel->sheet('Excel', function ($sheet) use ($licencies) {
                    $sheet->fromArray($licencies);

                });

            })->string('csv');

            Storage::disk('local')->put('licencies_export_'.$date.'.csv' , $file);

            return back()->with('status', "Fichier Exporté");

        }else{




        }


        return view('export/licences' , compact('type_licence' , 'structure' , 'structures' , 'licencies' , 'activite' , 'catg_licence'));

}

这里是完整的例外:

SQLSTATE[23000]:违反完整性约束:1052 列 where 子句中的“type_licence_id”不明确(SQL:选择 num_licence, civilite.lb_civilite, lb_nom, lb_prenom, dt_naissance, pays.fr 作为pays, activite_licencie.lb_activite, catg_licence.lb_catg_lic, type_licence.lb_type, saisons.lb_saison, lb_surclassement, structures.nom_structure, structures.num_structure, lb_assurance, cd_dept_naissance, lb_ville_naissance, lb_adresse, tel_fix_licencie, tel_port_licencie, adresse_email 来自licencies 内连接activite_licencie on activite_licencie.id = licencies.activite_licencie_id 内 在saisons.id 上加入saisons = licencies.saison_id 内连接 pays on pays.id = licencies.pays_naissance_id 内连接 type_licence on type_licence.id = licencies.type_licence_id 内部连接structuresstructures.id = licencies.structure_id 内部连接 ​​civilite civilite.id = licencies.civilite_id 内连接catg_licence on catg_licence.id = licencies.catg_licence_id 其中 type_licence_id = 4 和 catg_licence_id = 1)

【问题讨论】:

    标签: laravel


    【解决方案1】:

    当它说它不明确时,这意味着 mysql 正在连接表,并且在另一个表上找到了特定字段 (catg_licence_id)。因此,当您将某些内容加入该字段时,会发生什么情况,他不知道要加入哪个表。一个解决方案是把表名放在前面,就像刚才说的@user3154557

    ->join('tablename', 'tablename.field', 'othertablename.field')

    【讨论】:

      【解决方案2】:

      您不会在任何地方加入“许可”表。

      ->join('catg_licence', 'catg_licence.id', '=', 'licencies.catg_licence_id')
      

      那条线是你的问题。

      您也可能在选择时遇到同样的错误。加入一堆表时,最好将 table.property 放在 select 中,而不是放在 property 中。

      【讨论】:

      • 感谢您的回答!我怎么能做到这一点并解决问题?我更新了我的帖子,但完全例外!
      • 查询正在使用参数 structure_id 和 activite_licence_id 但不在同一时间,其余的我得到了异常
      猜你喜欢
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      相关资源
      最近更新 更多