Query Builder

The Samsara SDK provides a fluent query builder for filtering, pagination, and data retrieval.

Basic Usage

Access the query builder via the query() method on any resource:

use Samsara\Facades\Samsara;

$drivers = Samsara::drivers()
    ->query()
    ->whereTag('tag-123')
    ->get();

Some resources return a query builder directly:

$stats = Samsara::vehicleStats()
    ->types(['gps', 'engineStates'])
    ->get();

Filtering

By Tag

Filter by tag IDs:

// Single tag
->whereTag('tag-123')

// Multiple tags
->whereTag(['tag-123', 'tag-456'])

By Parent Tag

Filter by parent tag IDs:

->whereParentTag('parent-tag-id')

By Vehicle

Filter by vehicle IDs:

->whereVehicle('vehicle-123')
->whereVehicle(['vehicle-123', 'vehicle-456'])

By Driver

Filter by driver IDs:

->whereDriver('driver-123')
->whereDriver(['driver-123', 'driver-456'])

By Attribute

Filter by attribute value IDs:

->whereAttribute('attribute-value-id')

Custom Filters

Add arbitrary query parameters:

->where('customField', 'value')

Time Ranges

Between Two Dates

use Carbon\Carbon;

// Using strings
->between('2024-01-01T00:00:00Z', '2024-01-31T23:59:59Z')

// Using Carbon instances
->between(Carbon::now()->subDays(7), Carbon::now())

Start and End Time

->startTime('2024-01-01T00:00:00Z')
->endTime('2024-01-31T23:59:59Z')

Updated After

Filter records updated after a timestamp:

->updatedAfter('2024-01-01T00:00:00Z')

Created After

Filter records created after a timestamp:

->createdAfter('2024-01-01T00:00:00Z')

Stat Types

For telemetry resources, specify which stat types to retrieve:

use Samsara\Enums\VehicleStatType;

// Using strings
->types(['gps', 'engineStates', 'fuelPercents'])

// Using enum
->types([
    VehicleStatType::GPS,
    VehicleStatType::ENGINE_STATES,
    VehicleStatType::FUEL_PERCENTS,
])

Decorations

Include decorated values in the response:

->withDecorations(['address', 'reverseGeo'])

Expanding Nested Data

Include related data in the response:

->expand(['driver', 'vehicle'])

Pagination

Limit Results

// Limit to 50 results
->limit(50)

// Alias for limit
->take(50)

Cursor-Based Pagination

// Get first page
$paginator = Samsara::vehicles()
    ->query()
    ->limit(50)
    ->paginate();

// Iterate through items
foreach ($paginator as $vehicle) {
    echo $vehicle->name;
}

// Get next page
if ($paginator->hasMorePages()) {
    $nextPage = $paginator->nextPage();
}

Manual Cursor Navigation

// Start after a specific cursor
->after('cursor-token-from-previous-response')

Execution Methods

Get All Results

Returns an EntityCollection:

$drivers = Samsara::drivers()->query()->get();

Get First Result

Returns a single entity or null:

$driver = Samsara::drivers()
    ->query()
    ->whereTag('tag-123')
    ->first();

Paginate

Returns a CursorPaginator:

$paginator = Samsara::vehicles()
    ->query()
    ->paginate(50);

foreach ($paginator as $vehicle) {
    // Process vehicle
}

Lazy Loading

Returns a LazyCollection for memory-efficient processing:

Samsara::vehicleStats()
    ->types(['gps'])
    ->between($start, $end)
    ->lazy()
    ->each(function ($stat) {
        // Process each stat without loading all into memory
    });

Complete Examples

Fleet Overview

// Get all active drivers with their tags
$drivers = Samsara::drivers()
    ->active()
    ->get();

// Get vehicles by tag
$vehicles = Samsara::vehicles()
    ->query()
    ->whereTag('fleet-a')
    ->get();

Vehicle Telemetry

use Carbon\Carbon;

// Get GPS and fuel data for the last 24 hours
$stats = Samsara::vehicleStats()
    ->types(['gps', 'fuelPercents', 'engineStates'])
    ->whereVehicle(['vehicle-1', 'vehicle-2'])
    ->between(Carbon::now()->subDay(), Carbon::now())
    ->withDecorations(['address'])
    ->get();

Hours of Service

// Get HOS logs for specific drivers
$logs = Samsara::hoursOfService()
    ->logs()
    ->whereDriver(['driver-1', 'driver-2'])
    ->between($startOfWeek, $endOfWeek)
    ->get();

// Get current HOS clocks
$clocks = Samsara::hoursOfService()
    ->clocks()
    ->whereDriver('driver-1')
    ->get();

Processing Large Datasets

// Stream through all vehicle stats
$count = 0;

Samsara::vehicleStats()
    ->types(['gps'])
    ->between($start, $end)
    ->lazy(100) // Chunk size
    ->each(function ($stat) use (&$count) {
        $count++;
        // Process stat
    });

echo "Processed {$count} stats";

Building Queries Programmatically

$query = Samsara::vehicles()->query();

if ($tagId = request('tag_id')) {
    $query->whereTag($tagId);
}

if ($updatedAfter = request('updated_after')) {
    $query->updatedAfter($updatedAfter);
}

$vehicles = $query->limit(100)->get();

Back to top

Copyright © 2024-2025 Erik Galloway. Distributed under the MIT License.