Почему бы вам не сделать это так?
$query = DB::query(Database::SELECT,
'SELECT users.*
FROM users INNER JOIN roles_users ON users.id = roles_users.user_id
WHERE roles_users.role_id IN (1, 2)
GROUP BY users.id
HAVING COUNT(*) = 2'
);
$query->execute();
Пример:
$results = DB::query(Database::SELECT,
'SELECT * FROM
post_scheduled
WHERE
DATE(FROM_UNIXTIME(scheduled)) = DATE(NOW())
AND
TIME_FORMAT(FROM_UNIXTIME(scheduled), "%H:%i") = TIME_FORMAT(NOW(), "%H:%i")
AND
published = 0'
)->execute()->as_array();
foreach($results as $result)
{
$id = $result['id'];
# ...
}
Конструктор запросов ... (не проверял)
DB::select()
->from('users')
->join('roles_users')
->on('users.id', '=', 'roles_users.user_id')
->where('roles_users.role_id', 'IN', array(1, 2))
->group_by('users.id')
->having('COUNT(*)', '=', '2');