Laravel Query构建器:左连接,选择和不工作的地方

时间:2017-04-16 08:02:24

标签: sql laravel

不幸的是,Laravel查询构建器看起来心情不好!

这是我的表结构:

user结构

ID, USERNAME, NAME, USER_ROLE_MODULE_ID

user_role_module结构

ID, NAME 

这是我的查询构建器声明

DB::table('user')
->leftJoin('user_role_module', 'user.user_role_module_id', '=', 'user_role_module.id')
->select('user.*', 'user_role_module.name as user_role')
->where("name LIKE '%Jhon%' ") "or other example" ->where("user_role LIKE '%admin%' ")
->paginate(10);

目标:

我只想从user获取来自user_role_module的用户角色名称的所有数据,并且也适用于WHERE语句,因此我可以将其用于搜索功能。

我从WHERE语句获取结果而没有指定表名。因为它已经说明了从SELECT语句中选择哪个表和列。

问题:

  1. 如果我搜索名称,则返回错误含糊不清的列//无论是从用户表还是user_role_module表中取出name,Laravel都会感到困惑!

  2. 如果我搜索user_role,则该列不存在

  3. 为什么?解决办法是什么?

2 个答案:

答案 0 :(得分:1)

改变这个:

DB::table('user')
->leftJoin('user_role_module', 'user.user_role_module_id', '=', 'user_role_module.id')
->select('user.*', 'user_role_module.name as user_role')
->where("name LIKE '%Jhon%' ") "or other example" ->where("user_role LIKE '%admin%' ")
->paginate(10);

用这个:

DB::table('user')
->leftJoin('user_role_module', 'user.user_role_module_id', '=', 'user_role_module.id')
->where('user.name', 'like', '%Jhon%')
->select('user.*', 'user_role_module.name as user_role')
->get();

并进行自定义分页,因为select不使用paginate。

答案 1 :(得分:1)

问题:

user.NAME                 <-- both these columns are called NAME
user_role_module.NAME     <--

您的Laravel查询存在多个问题。正如@Viktor正确指出的那样,你的连接条件是错误的。您应该加入user.USER_ROLE_MODULE_IDuser_role_module.id。但我认为错误的直接原因是两个表都有一个NAME列。

只需使用表列名称指定所需的列。这样,任何列名都不会有歧义。

DB::table('user')
->leftJoin('user_role_module', 'user.USER_ROLE_MODULE_ID', '=', 'user_role_module.id')
->select('user.ID', 'user.USERNAME', 'user.NAME AS userName',
         'user_role_module.name as user_role')
->where("name LIKE '%John%'")
->paginate(10);