Laravel - Остановить множественные запросы

В настоящее время у меня есть функциональность, чтобы получить некоторую статистику из моей базы данных, используя Query Builder, а не Eloquent.

Допустим, я хочу получить количество пользователей, у которых есть токен iOS, а затем пользователи, у которых есть токен android в одной из моих таблиц.

class Connection {
 public function __construct()
 {
 return $this->db = DB::connection('database_one');
 }
}

class Statistics extends Connection {
 public function devices()
 {
 $this->devices = $this->db->table('users_devices');

 $arr = [
 'ios' => $this->devices->where('ios_push_token', '!=', '')->count(),
 'android' => $this->devices->where('android_push_token', '!=', '')->count(),
 ];

 return $arr; 
 }
}

Запрос на получение ios устройств правильный:

select count(*) as aggregate from 'users_devices' where 'ios_push_token' != ?
array (size=1)
 0 => string '' (length=0)

Тем не менее, я тогда попал в проблему с значением android, запрос пытается выполнить:

select count(*) as aggregate from 'users_devices' where 'ios_push_token' != ? and 'android_push_token' != ?
array (size=2)
 0 => string '' (length=0)
 1 => string '' (length=0)

Кажется, это цепочка предложения where из первого запроса на второй запрос и т.д. Для нескольких экземпляров, что дает мне неправильные данные.

Я думаю, что это связано с использованием одного экземпляра DB::connection, но я не уверен?

1 ответ

Как насчет:

class Statistics {
 public function devices()
 {
 $arr = [
 'ios' => DB::table('users_devices')->where('ios_push_token', '!=', '')->count(),
 'android' => DB::table('users_devices')->where('android_push_token', '!=', '')->count(),
 ];

 return $arr; 
 }
}

Или клонировать объект:

class Connection {
 public function __construct()
 {
 return $this->db = DB::connection('database_one');
 }
}

class Statistics extends Connection {
 public function devices()
 {
 $this->devices = $this->db->table('users_devices')->remember(30); // etc.

 $ios = clone $this->devices;
 $android= clone $this->devices;

 $arr = [
 'ios' => $ios->where('ios_push_token', '!=', '')->count(),
 'android' => $android->where('android_push_token', '!=', '')->count(),
 ];

 return $arr; 
 }
}

licensed under cc by-sa 3.0 with attribution.