daikazu/eloquent-salesforce-objects
Laravel Eloquent-style models for Salesforce sObjects. Query and sync Salesforce data using familiar Eloquent patterns, with object mapping and relationships to work with Accounts, Contacts, and more from your Laravel app.
Pros:
Model::all(), Model::find(), relationships) for Salesforce data.omniphx/forrest, a robust Salesforce API wrapper, ensuring compatibility with Salesforce’s REST API and bulk operations.Cons:
snake_case tables) may clash with Salesforce’s PascalCase object naming and API quirks (e.g., composite keys, custom metadata).forrest supports bulk operations, the Eloquent layer may not expose them intuitively (e.g., no Model::chunk() for Bulk API).WhatId fields in Task). Eloquent’s relationship methods (e.g., belongsTo) may need overrides.with()) could trigger N+1 queries if not optimized for Salesforce’s API limits (e.g., 200 records per SOQL query).forrest. Misconfiguration could lead to failed API calls.forrest or using a local Salesforce sandbox, adding complexity.Use Case Clarity:
Performance Requirements:
Data Consistency:
LastModifiedDate checks)?Error Handling:
INVALID_FIELD, DUPLICATE_VALUE) be translated into Laravel exceptions?Long-Term Maintenance:
forrest or Laravel/Eloquent evolve)?Security:
consumer_key, private_key) be stored (env vars, Vault)?Alternatives:
forrest directly) be more flexible for niche use cases?laravel-salesforce (if migrating from that package).User, Account, or custom objects).Assessment Phase:
Account → AccountModel).Proof of Concept (PoC):
Lead) using the package.Lead::with('Contact')), and error handling.forrest usage.Incremental Rollout:
Lead::where('status', 'Open')->get()).forrest’s Bulk API directly).Model::saved() → trigger Salesforce flows).Deprecation Plan:
forrest’s supported API versions (e.g., REST v56.0). Ensure alignment with your org’s API version.laravel-salesforce, evaluate duplication of effort.Setup:
composer require daikazu/eloquent-salesforce-objects.forrest in .env (e.g., SALESFORCE_CLIENT_ID, SALESFORCE_PRIVATE_KEY).php artisan vendor:publish --provider="Daikazu\EloquentSalesforceObjects\ServiceProvider".Model Definition:
use Daikazu\EloquentSalesforceObjects\EloquentSalesforceModel;
class Account extends EloquentSalesforceModel
{
protected $objectName = 'Account'; // Salesforce API name
protected $primaryKey = 'Id'; // Salesforce ID field
}
Basic Usage:
$account = Account::find('001xx000003DGgJAAU');
$accounts = Account::where('Industry', 'Technology')->get();
Relationships:
class Contact extends EloquentSalesforceModel
{
public function account()
{
return $this->belongsTo(Account::class, 'AccountId', 'Id');
}
}
Advanced:
$results = Account::query()->soql('SELECT Id,
How can I help you explore Laravel packages today?