Skip to content

Associations ​

Associations represent the relationships between HubSpot CRM objects, such as contacts linked to companies or deals linked to line items. Laravel HubSpot provides an Eloquent-style API for managing these relationships.

Accessing Associated Records ​

Association methods are defined on each model and return an Association instance:

php
use Rollogi\LaravelHubspot\Crm\Contact;

$contact = Contact::findOrFail('123');

// Get all associated companies
$companies = $contact->companies()->get();

// Access via magic property (returns the collection)
$companies = $contact->companies;

// Access singular (returns first associated record)
$company = $contact->company;

Eager Loading ​

Include associations in the initial query to avoid N+1 requests:

php
use Rollogi\LaravelHubspot\Crm\Contact;

$contacts = Contact::query()
    ->with(['companies', 'deals'])
    ->get();

Creating Associations ​

php
use Rollogi\LaravelHubspot\Crm\Contact;

$contact = Contact::findOrFail('123');

// Attach an existing company
$contact->companies()->attach('456');
$contact->companies()->attach($companyModel);

// Create a new company and automatically associate it
$company = $contact->companies()->create([
    'name' => 'Acme Corp',
    'domain' => 'acme.com',
]);

Detaching ​

php
use Rollogi\LaravelHubspot\Crm\Contact;

$contact = Contact::findOrFail('123');

// Detach specific associations
$contact->companies()->detach('456');
$contact->companies()->detach(['456', '789']);
$contact->companies()->detach($companyModel);

// Detach all associations
$contact->companies()->detach();

Syncing ​

Sync brings the association set to exactly the IDs you provide, attaching missing ones and detaching extras using minimum API calls.

sync ​

php
use Rollogi\LaravelHubspot\Crm\Contact;

$contact = Contact::findOrFail('123');

// Sync to exactly these companies (attach new, detach removed)
$changes = $contact->companies()->sync(['456', '789', '012']);
// Returns: ['attached' => ['789', '012'], 'detached' => ['old-id']]

syncWithoutDetaching ​

php
// Sync without detaching (only attach missing)
$changes = $contact->companies()->syncWithoutDetaching(['456', '789']);
// Returns: ['attached' => ['789']]

toggle ​

php
// Toggle — attached become detached, detached become attached
$changes = $contact->companies()->toggle(['456', '789']);
// Returns: ['attached' => [...], 'detached' => [...]]

All sync operations accept IDs as strings, integers, or Model instances. They use HubSpot's v4 batch endpoints and automatically chunk at 100 per request.

Getting Current Association IDs ​

Retrieve the current associated IDs without hydrating full models:

php
$ids = $contact->companies()->currentIds(); // Illuminate\Support\Collection of string IDs