为什么我的查询错了?

时间:2014-03-28 10:09:49

标签: mysql laravel laravel-4

在我使用表的别名之前我得到错误:

:违反诚信约束:1052栏' id'在字段列表中是不明确的

然后我使用了别名,我收到了这个错误:

未知索引a

我正在尝试获取类别名称列表(取决于翻译)以及相关的类别ID,这是唯一的。由于我需要将它们放入选择中,我看到我应该使用列表。

 $categorie= DB::table('cat as a')              
                    ->join('campo_cat as c','c.id_cat','=','a.id')
                    ->join('campo as d','d.id','=','c.id_campo')
                    ->join('cat_nome as nome','nome.id_cat','=','a.id')
                    ->join('lingua','nome.id_lingua','=','lingua.id')
                    ->where('lingua.lingua','=','it-IT')
                    ->groupby('nome.nome')
                    ->lists('nome.nome','a.id');

2 个答案:

答案 0 :(得分:2)

调试查询的最佳方法是查看Laravel生成的原始查询,并尝试在您喜欢的SQL工具(Navicat,MySQL cli工具......)中运行此原始查询,以便您可以将其转储到日志中:

DB::listen(function($sql, $bindings, $time) { 
    Log::info($sql); 
    Log::info($bindings); 
});

与你合作我至少可以看到一个问题:

->where('lingua.lingua','=','it-IT')

必须更改为

->where('lingua.lingua','=',"'it-IT'")

答案 1 :(得分:0)

正如@jmail所说的那样,你并没有真正地描述这个问题,而是你最终做了什么来绕过(部分)它。但是,如果我正确地阅读了您的问题,那么您说的最初是在没有所有别名的情况下完成的,而是“模糊不清”。错误。

首先让我解释一下:这会发生,因为该查询的很多部分都使用id而不是合格的table`.`id

如果您考虑一下,如果没有别名,您的查询看起来有点像这样:SELECT * FROM `cat` JOIN `campo_cat` ON `id_cat` = `id` JOIN `campo` ON `id` = `id_campo`;突然之间,MySQL并不知道所有这些id列所引用的表。因此,要解决所有你需要做的就是命名你的字段(即使用... JOIN `campo` ON `campo`.`id` = `campo_cat`.`id_campo`...)。在你的情况下,你已经更进一步,并使你的表别名。这可以使查询更简单,但您不需要实际执行此操作。

接下来你的问题 - 这将是一个Laravel错误。并且可能是因为key列中的lists($valueColumn, $keyColumn)列未在结果中找到。这是因为您在MySQL不再包含的部分代码中引用cat.id列(在您的别名情况a.id中没问题) - lists()在Laravel从数据库中获取结果后,该方法实际上是在PHP中运行的。因此,没有名为a.id的列。它可能会被称为id,但由于您没有专门请求它,您可能会发现模糊的问题又回来了。我的建议是专门选择它并为列添加别名。尝试类似下面的内容:

$categories = DB::table('cat as a')              
                  ->join('campo_cat as c','c.id_cat','=','a.id')
                  ->join('campo as d','d.id','=','c.id_campo')
                  ->join('cat_nome as nome','nome.id_cat','=','a.id')
                  ->join('lingua','nome.id_lingua','=','lingua.id')
                  ->where('lingua.lingua','=','it-IT')
                  ->groupby('nome.nome')
                  ->select('nome.nome as nome_nome','a.id as a_id') // here we alias `.id as a_id
                  ->lists('nome_nome','a_id'); // here we refer to the actual columns

它可能无法完美运行(我不会使用->select()因此不知道您是否传递了数组或多个参数,您也可能需要DB::raw()将每个参数包裹起来为了做别名)但希望你能得到我的意思并且可以让它发挥作用。