【问题标题】:Convert MySQL search for a pair of values in a table to Eloquent query将 MySQL 对表中一对值的搜索转换为 Eloquent 查询
【发布时间】:2017-07-29 11:14:19
【问题描述】:

我无法使用 Eloquent 重现这种 MySQL 查询

SELECT  *
    FROM    foo
    WHERE   (column1, column2) IN (('foo', 1), ('bar', 2))

Eloquent 查询生成器中有一个方法叫whereIn(),但它只能接收一列作为参数:

/**
 * Add a "where in" clause to the query.
 *
 * @param  string  $column
 * @param  mixed   $values
 * @param  string  $boolean
 * @param  bool    $not
 * @return $this
 */
public function whereIn($column, $values, $boolean = 'and', $not = false)
{ 
   ...
}

所以,你不能这样做

$qb = $this->model->whereIn(['column1', 'column2'], array([1, 2], [1,3], [3, 32]));

我目前正在努力寻找解决方案,但如果有人能提供帮助,我将非常感激:)

编辑: 我设法做到了:

/**
 * ...
 */
public function findConnectionsByUser(User $user, array $userConnectionIds)
{
    $qb = $this->model->query();

    ...

    return $this->createQueryBuilderForUserConnectionsWithUserIds($qb, $user, $userConnectionIds)->get();
}

/**
 * @param Builder $qb
 * @param User    $user
 * @param array   $userConnectionIds
 *
 * @return Builder
 */
private function createQueryBuilderForUserConnectionsWithUserIds(Builder $qb, User $user, array $userConnectionIds)
{
    foreach ($userConnectionIds as $userConnectionId) {
        $qb->orWhere(array(
            array('receiver_id', $user->id),
            array('initiator_id', $userConnectionId)
        ))
            ->orWhere([
                ['receiver_id', $userConnectionId],
                ['initiator_id', $user->id]
            ]);
    }

    return $qb;
}

EDIT 2(更具扩展性的解决方案):

$qb = $this->model->query();
$oneSide = $this->model->newQuery()->where('receiver_id', '=', $user->id)
            ->whereIn('initiator_id', $userConnectionsIds);

return $qb->where('initiator_id', '=', $user->id)
            ->whereIn('receiver_id', $userConnectionsIds)
        ->union($oneSide)->get();

【问题讨论】:

    标签: mysql laravel eloquent where-in


    【解决方案1】:

    你可以尝试像这样嵌套它们

    $qb = $this->model->whereIn('column1', [1, 2, 3])
    ->orWhere(function ($query) {
        $query->whereIn('column2', [2, 3, 32]);
    });
    

    也不确定您是否可以像这样简单地使用 to whereIn。先试试吧

    $qb = $this->model->whereIn('column1', [1, 2, 3])
    ->whereIn('column2', [2, 3, 32]);
    

    第一个查询更像OR,第二个更像AND 查询。

    【讨论】:

    • 在看到您的回答之前,我设法解决了我的问题。但是,对于小测试,我根据我的目的调整了你的代码,它似乎正在工作,Tnx!
    【解决方案2】:

    这有点粗略,但您可以将列连接为一列,用一些其他未使用的字符(如“|”)将两者分开。

    【讨论】:

    • 嗯.. 我认为这没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2020-09-19
    • 1970-01-01
    相关资源
    最近更新 更多