【问题标题】:laravel mysql query with multiple where orwhere and inner joinlaravel mysql查询具有多个where orwhere和inner join
【发布时间】:2015-01-19 16:48:21
【问题描述】:

如何在 Laravel 中准备以下 MySQL 查询?

这是我使用但没有成功的代码:

$user_list = DB::table('users')
->where('users.user_id' ,'=', $clientId)
->where('users.firstname', 'LIKE', '%'.$_POST['name'].'%')
->orWhere('users.lastname', 'LIKE', '%'.$_POST['name'].'%')
->orWhere('users.email', 'LIKE', '%'.$_POST['name'].'%')
->join('users_roles', 'users.id', '=', 'users_roles.user_id')                        
->where('users_roles.role_id', '=', Role::USER_PARTICIPANT)
->get();

条件必须是:

  1. users.user_id == $clientId
  2. users.firstname == '%'.$_POST['name'].'%' OR users.lastname == '%'.$_POST['name'].'%' OR users.email == '%'.$_POST['name'].'%'
  3. users_roles 和用户之间的内连接 users.id == users_roles.user_id when users_roles.role_id == Role::USER_PARTICIPANT

【问题讨论】:

  • 我已经试过了。我用我的代码更新了问题

标签: php mysql laravel


【解决方案1】:

好吧,看来你的问题出在 嵌套 where

试试这个:

$name = $_POST['name']; // I'd recommend you use Input::get('name') instead...

$user_list = DB::table('users')
    ->where('users.user_id' ,'=', $clientId)
    ->where(function($query) use ($name){
        $query->where('users.firstname', 'LIKE', '%'.$name.'%');
        $query->orWhere('users.lastname', 'LIKE', '%'.$name.'%');
        $query->orWhere('users.email', 'LIKE', '%'.$name.'%');
    })
    ->join('users_roles', 'users.id', '=', 'users_roles.user_id')
    ->where('users_roles.role_id', '=', Role::USER_PARTICIPANT)
    ->get();

【讨论】:

  • 我得到错误:语法错误,意外的“使用”(T_STRING),期待“{”。这里: function($query) 使用 ($name){
  • 哎呀错字了,其实是use
  • 谢谢!那行得通。顺便说一句,您错过了查询后的分号。
  • 你找到我了,复制粘贴 ;)
【解决方案2】:

我认为您想研究在 join 子句上使用内联函数的可能性...您的 where 子句可能会发生冲突 - 实际上您希望 role_id 子句出现在您的 join 上。

http://laravel.com/docs/4.2/queries#joins

$clientId = 1;
$name = 'Phillip';
$escaped = '%' . $name . '%';

$userList = DB::table('users')
    ->where('users.user_id', $clientId)
    ->where('firstname', 'LIKE', $escaped)
    ->orWhere('lastname', 'LIKE', $escaped)
    ->orWhere('email', 'LIKE', $escaped)
    ->join('users_roles', function($join) {
        $join->on('users.user_id', '=', 'users_roles.user_id')
            ->where('users_roles.role_id', '=', Role::USER_PARTICIPANT);
    })->get();

var_dump($userList);

上面产生了这个查询:

select *
from `users`
inner join `users_roles` on `users`.`user_id` = `users_roles`.`user_id` and `users_roles`.`role_id` = ?
where `users`.`user_id` = ?
and `firstname` LIKE ?
or `lastname` LIKE ?
or `email` LIKE ?

考虑到以下数据库,这让我回了一行:

mysql> desc users;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| user_id   | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| firstname | varchar(255)     | NO   |     | NULL    |                |
| lastname  | varchar(255)     | NO   |     | NULL    |                |
| email     | varchar(255)     | NO   |     | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)

mysql> desc users_roles;
+---------+------------------+------+-----+---------+-------+
| Field   | Type             | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+-------+
| user_id | int(11) unsigned | NO   |     | NULL    |       |
| role_id | int(11) unsigned | NO   |     | NULL    |       |
+---------+------------------+------+-----+---------+-------+
2 rows in set (0.03 sec)

mysql> select * from users;
+---------+-----------+------------+--------------------+
| user_id | firstname | lastname   | email              |
+---------+-----------+------------+--------------------+
|       1 | Phillip   | Harrington | philsown@gmail.com |
+---------+-----------+------------+--------------------+
1 row in set (0.00 sec)

mysql> select * from users_roles;
+---------+---------+
| user_id | role_id |
+---------+---------+
|       1 |       1 |
+---------+---------+
1 row in set (0.00 sec)

【讨论】:

  • 我也有同样的问题,我有和你一样的 where:where,orWhere,orWhere 但是为什么当我用 dd($sql) 检查它时,第二个 where 出现一个运算符 "and "而不是或?
猜你喜欢
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2021-02-11
相关资源
最近更新 更多