Laravel Eloquent比较列值

47

当使用Eloquent的where()比较两个列的值时,似乎无法正常工作。如何解决?

示例代码:

->where('table_1.name', '=', 'table_2.name')

但适用于:

->where('table_1.name', '=', 'john')

如果有帮助,请接受我的答案以供其他读者参考 :) - Limon Monte
可能是使用Eloquent Laravel比较某个表的两列的重复问题。 - Ivanka Todorova
3个回答

92

在这种情况下,不需要转义,您可以使用 whereRaw()

->whereRaw('table_1.name = table_2.name')

1
好的。谢谢!除了你的解决方案,我也回答了我的问题。当我的投票积分恢复时,我会给你的答案点赞。 - Jake Opena
有没有使用“where”子句来实现这个的方法? - Prince Arora

77

您可以使用 where 子句指定列:

->whereColumn('table_1.name', 'table_2.name')

1
只想补充一下,这种方法仅在laravel 5中添加。如果您像我一样正在处理laravel 4项目,请使用其他答案中的方法。 - cytsunny
5
你还可以传递一个比较运算符和/或多个条件的数组。例如:->whereColumn([ ['first_name', '=', 'last_name'], ['updated_at', '>', 'created_at'] ]); - cdwyer

16

我搞清楚了。 'table_2.name' 被解释为普通字符串而不是 mysql 表列。

可能的解决方案:

  1. \DB::raw() 包装 'table_2.name'

->where('table_1.name', '=', \DB::raw('table_2.name'))
  • 使用whereRaw()将整个表达式包裹起来(基于@limonte的答案)

  • ->whereRaw('table_1.name = table_2.name')
    

    1
    是的。谢谢。我刚刚添加了一种替代方案。不一定是更好的解决方案 :) - Jake Opena

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接