pelfox / laravel-bigquery

v1.5.1 2024-04-11 15:17 UTC

This package is auto-updated.

Last update: 2024-09-11 16:06:28 UTC


README

此包允许您使用查询构建器和Eloquent在Bigquery中进行查询。

安装

composer require pelfox/laravel-bigquery

使用

在'database'配置中的'sections'部分添加代码

'bigquery' => [
    'driver' => 'bigquery',
    'database' => '',
    'prefix' => '',
    // default the id of the dataset to request
    'dataset' => 'replace on dataset from bigquery', // required
    //  The full path to your service account credentials .json file retrieved from the Google Developers Console.
    'keyFilePath' => 'path to file', // required
],

外观

\Pelfox\LaravelBigQuery\Facades\BigQuery::dataset('dataset')->...

在查询构建器或Eloquent中使用

// Query Builder
DB::connection('bigquery')->table('table')->...
#for special dataset
DB::connection('bigquery')->table('dataset.table')->...

// Eloquent
class Table extends Model
{
    protected $connection = 'bigquery';
    #for special dataset
    protected $table = 'dataset.table';

    public $incrementing = false;
    public $timestamps = false;
}

您可能需要使用特殊的Eloquent转换,这些转换与Bigquery的数据类型兼容

转换命名空间: \Pelfox\LaravelBigQuery\Eloquent\Casts

如果字段重复(模式为重复),需要传递一个额外的参数给Cast ':1'

'field' => AsString::class . ':1'

然后可以传递一个值数组到字段值

对于struct数据类型,需要传递一个返回模式数组的函数

'field' => AsString::class . ':0,getSchemaForFieldColumn'

struct字段的模式应该与Bigquery中的相同,否则在插入数据时将出现错误

示例:具有转换的模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsBigNumeric;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsBoolean;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsBytes;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsDate;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsDateTime;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsFloat;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsInteger;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsJson;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsNumeric;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsString;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsStruct;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsTime;
use Pelfox\LaravelBigQuery\Eloquent\Casts\AsTimestamp;
use Pelfox\LaravelBigQuery\Types\IntegerType;
use Pelfox\LaravelBigQuery\Types\StringType;

class Test extends Model
{
    use HasFactory, HasUuids;

    protected $table = 'test';

    public $timestamps = false;

    protected $connection = 'bigquery';

    protected $fillable = [
        'string', 'integer', 'bytes', 'float', 'numeric', 'bignumeric',
        'boolean', 'timestamp', 'date', 'time', 'datetime',
        'record', 'json', 'strings', 'struct'
    ];

    protected $casts = [
        'string' => AsString::class,
        'strings' => AsString::class . ':1',
        'bytes' => AsBytes::class,
        'integer' => AsInteger::class,
        'float' => AsFloat::class,
        'numeric' => AsNumeric::class,
        'bignumeric' => AsBigNumeric::class,
        'boolean' => AsBoolean::class,
        'timestamp' => AsTimestamp::class,
        'date' => AsDate::class,
        'time' => AsTime::class,
        'datetime' => AsDateTime::class,
        'record' => AsStruct::class . ':0,getSchemaForRecord',
        'json' => AsJson::class,
        'struct' => AsStruct::class . ':0,getSchemaForStruct'
    ];

    public function getSchemaForRecord(): array
    {
        return [
            'string' => StringType::class
        ];
    }

    public function getSchemaForStruct(): array
    {
        return [
            'string' => StringType::class,
            'integer' => IntegerType::class,
            'names' => [StringType::class],
            'struct' => [
                'string' => StringType::class,
                'integer' => IntegerType::class,
            ],
            'array' => [
                [
                    'string' => StringType::class,
                    'integer' => IntegerType::class
                ]
            ]
        ];
    }
}