google/cloud-bigquery
Idiomatic PHP client for Google BigQuery. Create and manage datasets/tables, load data (e.g., CSV), run query jobs, and iterate results. Part of Google Cloud PHP; includes auth, debugging guidance, and full API docs.
Install the Package
composer require google/cloud-bigquery
Add the package to your config/app.php providers (if not using Laravel’s auto-discovery):
'providers' => [
// ...
Google\Cloud\BigQuery\BigQueryClient::class,
],
Set Up Authentication
Configure credentials via .env (recommended) or config/services.php:
GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json
Or use environment variables:
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json');
First Query
use Google\Cloud\BigQuery\BigQueryClient;
$bigQuery = new BigQueryClient([
'projectId' => env('GOOGLE_CLOUD_PROJECT'),
]);
$query = 'SELECT * FROM `project.dataset.table` LIMIT 10';
$results = $bigQuery->query($query);
foreach ($results as $row) {
dd($row); // Inspect the first row
}
Key First Use Cases
$query = $bigQuery->query('SELECT name, email FROM `users` WHERE active = true');
foreach ($query as $row) {
// Process row (e.g., $row['name'])
}
$query = $bigQuery->query(
'SELECT * FROM `users` WHERE created_at > @date',
['date' => new \Google\Cloud\Core\Timestamp('2023-01-01')]
);
$query = $bigQuery->query('SELECT * FROM `large_table`');
while ($row = $query->rows()->next()) {
// Process row-by-row
}
$table = $bigQuery->dataset('analytics')->table('events');
$jobConfig = $table->load(
fopen('events.csv', 'r'),
'CSV',
['schema' => ['fields' => [...]]] // Optional schema
);
$job = $table->runJob($jobConfig);
$job->wait(); // Block until completion
$jobConfig = $table->load(
'gs://bucket/events.json',
'NEWLINE_DELIMITED_JSON'
);
if ($job->isComplete()) {
$errors = $job->info()->getErrors();
if (!empty($errors)) {
throw new \RuntimeException($errors[0]->getMessage());
}
}
$table = $bigQuery->dataset('analytics')->table('events');
$table->create([
'schema' => [
'fields' => [
['name' => 'event_id', 'type' => 'STRING'],
['name' => 'timestamp', 'type' => 'TIMESTAMP'],
],
],
]);
$table->create([
'timePartitioning' => ['type' => 'DAY'],
'clustering' => ['fields' => ['user_id']],
]);
// In AppServiceProvider@boot()
$this->app->singleton(BigQueryClient::class, function ($app) {
return new BigQueryClient([
'projectId' => env('GOOGLE_CLOUD_PROJECT'),
]);
});
use Illuminate\Console\Command;
use Google\Cloud\BigQuery\BigQueryClient;
class SyncUsersCommand extends Command
{
protected $bigQuery;
public function __construct(BigQueryClient $bigQuery)
{
parent::__construct();
$this->bigQuery = $bigQuery;
}
public function handle()
{
$query = $this->bigQuery->query('SELECT * FROM `users`');
// Process results...
}
}
class BigQueryUserRepository
{
protected $bigQuery;
public function __construct(BigQueryClient $bigQuery)
{
$this->bigQuery = $bigQuery;
}
public function findActiveUsers()
{
return $this->bigQuery->query('SELECT * FROM `users` WHERE active = true');
}
}
$queryConfig = $bigQuery->query(
'SELECT * FROM `project.dataset.table`',
['useLegacySql' => false, 'priority' => 'BATCH']
);
$queryConfig->setQueryOptions(['priority' => 'BATCH']);
$results = $bigQuery->runQuery($queryConfig);
$jobs = [];
foreach ($files as $file) {
$jobConfig = $table->load($file);
$jobs[] = $table->runJob($jobConfig);
}
// Wait for all jobs
array_walk($jobs, function ($job) { $job->wait(); });
try {
$results = $bigQuery->query('SELECT * FROM `table`');
} catch (\Google\ApiCore\ApiException $e) {
if ($e->getStatusCode() === 429) { // Too Many Requests
sleep(2);
retry();
}
throw $e;
}
$bigQuery = new BigQueryClient([
'logger' => new \Monolog\Logger('bigquery', [
new \Monolog\Handler\StreamHandler(storage_path('logs/bigquery.log')),
]),
]);
$cacheKey = 'bigquery:active_users';
$users = cache()->remember($cacheKey, now()->addHours(1), function () {
return $bigQuery->query('SELECT * FROM `users` WHERE active = true');
});
$columns = ['name', 'email'];
$where = ['active' => true];
$sql = "SELECT " . implode(', ', $columns) .
" FROM `users` WHERE " .
implode(' AND ', array_map(fn($k, $v) => "$k = '$v'", array_keys($where), $where));
// Example: Listen for job completion via Pub/Sub
$job->addListener(function ($job) {
if ($job->isComplete()) {
event(new BigQueryJobCompleted($job));
}
});
Authentication Issues
Google\Auth\Exception\GoogleAuthException: Could not load credentials.GOOGLE_APPLICATION_CREDENTIALS points to a valid service account JSON key.$bigQuery = new BigQueryClient(['projectId' => env('GOOGLE_CLOUD_PROJECT')]);
Query Timeouts
$queryConfig = $bigQuery->query('SELECT * FROM `
How can I help you explore Laravel packages today?