【发布时间】:2016-03-18 04:24:37
【问题描述】:
找了半天,不敢相信Laravel没有这个功能。
所以,我可以写:
select * from a join b where a.id = b.id
或者更漂亮:
select * from a join b using(id)
第一种情况对于 Laravel 来说很简单:
$query->leftJoin('b', 'a.id', '=', 'b.id')
但是如何写第二种情况呢?我希望它应该简单而简短,例如:
$query->joinUsing('b', 'id')
但是没有这样的方法,我也找不到。
PS:答案可能很简单,只是用“使用”这个词很难找到,因为它无处不在。
更新
我要更深入地寻找源代码,尝试创建范围或传递一个函数来加入,但即使在这个函数内部,我也无法用这个 $query 做任何事情。示例:
public function scopeJoinUsing($query, $table, $field) {
sql($query->join(\DB::raw("USING(`{$field}`)")));
// return
// inner join `b` on USING(`id`) ``
// yes, with "on" and with empty quotes
sql($query->addSelect(\DB::raw("USING(`{$field}`)")));
// return
// inner join `b` USING(`id`)
// but in fields place, before "FROM", which is very logic :)
}
所以即使忘记范围,我也不能在 DB::raw() 中做到这一点,所以这是不可能的......我第一次看到 Laravel 中不可能的事情。
【问题讨论】:
-
你想通过这个'using(id)'来做什么。您期望从查询中得到什么样的结果。
-
据我了解文档和 API,您要查找的内容不存在。您可以提出拉取请求以包含它!
-
@AlankarMore ,我有一个很大的复杂查询,带有 SELECT * FROM (SELECT * with JOIN)。当我使用 JOIN ON 进行子查询时,结果我有 2 个具有相同名称“id”的列。我有一个错误“重复的列”。使用 USING 很容易修复,因为它只会返回 1 列“id”。其他选项 - 不要在 SELECT 中使用“table_name.*”,但它太长而且错误,如果我可以用简单的 MySQL 命令修复它。
-
@El_Matella ,是的,现在我明白了。当然,我可以修复它并提出拉取请求,但这还有很长的路要走。现在我正在寻找一些丑陋的 hack,这是可行的,我将把它隐藏在一个不错的范围内,它就完成了。
-
您真的需要表格中的所有字段吗?如果没有,那么您可以为重复的列创建别名。您可能已经尝试过,但只是一个建议,您可以像
SELECT table.id as tableId FROM table一样使用它。