【发布时间】: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