【问题标题】:Laravel 5. Using the USING operatorLaravel 5. 使用 USING 运算符
【发布时间】: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 一样使用它。

标签: php laravel join using


【解决方案1】:

所以,答案是 - 这是不可能的。

Laravel 不支持这个功能,真的很遗憾。

我在 Laravel 源代码中修复了它,我的 PULL REQUEST 在这里 - https://github.com/laravel/framework/pull/12773

【讨论】:

  • 正是我的问题 - 是的,我很惊讶这是不可能的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多