Laravel Querybuilder加入LIKE

时间:2017-05-24 02:55:38

标签: php laravel

我正在尝试使用Laravel的查询构建器连接两个表但是我似乎遇到了使用查询构建器获得所需结果的问题,但是我可以使用原始SQL语句来完成它。我只想返回tag表中tags列中具有相应值的所有mod行。

Schema

--------------
mods
--------------
id - int - (primary key)
name - varchar

--------------
tags
--------------
id - int
modid - int - (primary key of its parent mod)
tag - varchar

使用SQL查询

SELECT * FROM mod JOIN tags ON tags.tag LIKE '%FPS%'

查询构建器

DB::table('mods')
 ->join('tags', function ($join) {
     $join->on('tags.tag', 'like', '%FPS%');
 })
 ->get();

目前这告诉我:Unknown column '%FPS%' in 'on clause'但我不确定如何构建它。我打算添加更多orOn条款以及我想要在多个标签上获得结果,但首先我只想让单个标签工作。

感谢任何帮助。

4 个答案:

答案 0 :(得分:3)

SELECT * FROM mod JOIN tags ON tags.tag LIKE '%FPS%'

您的查询构建器拒绝生成此查询,因为它是无意义的!

要正常工作,JOIN子句需要比较两列是否相等 - 连接表每一侧有一列。一个JOIN条款没有做到这一点在功能上降级""降级"到WHERE条款。在此查询的情况下,两个表最终交叉连接。

你可能想要的是:

SELECT * FROM mod
  JOIN tags ON tags.modid = mod.id
  WHERE tags.tag LIKE '%FPS%';

答案 1 :(得分:1)

$join->on('tags.tag', 'like', '%FPS%');

尝试替换

$join->where('tags.tag', 'like', '%FPS%');

答案 2 :(得分:1)

这是因为on方法等待字段名称而不是查询值,如果您希望以这种方式处理它,则应使用DB::raw('%FPS%')

也许您正在尝试执行以下操作:

DB::table('mods')
    ->select(DB::raw('mods.id as modid, mods.name, tags.id as tagid, tags.tag'))
    ->join('tags', function ($join) {
        $join->on('tags.modid', '=', 'mods.id');
    })
    ->where('tags.tag', 'like', '%FPS%')
    ->get();

答案 3 :(得分:0)

如果要查看数据库使用中运行的内容 DD(DB :: getQueryLog()) 查看运行了哪些查询。

试试这个 谢谢