在我使用表的别名之前我得到错误:
:违反诚信约束: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');
答案 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()
将每个参数包裹起来为了做别名)但希望你能得到我的意思并且可以让它发挥作用。