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.
Installation
composer require daikazu/eloquent-salesforce-objects
Publish the config (if needed):
php artisan vendor:publish --provider="Daikazu\SalesforceObjects\SalesforceObjectsServiceProvider"
Configure Salesforce Connection
Edit .env or config/salesforce-objects.php with your Salesforce credentials:
SALESFORCE_CLIENT_ID=your_client_id
SALESFORCE_CLIENT_SECRET=your_client_secret
SALESFORCE_USERNAME=your_username
SALESFORCE_PASSWORD=your_password+security_token
SALESFORCE_DOMAIN=login.salesforce.com # or your custom domain
Define a Salesforce Model
Extend Daikazu\SalesforceObjects\Eloquent\SalesforceModel:
use Daikazu\SalesforceObjects\Eloquent\SalesforceModel;
class Account extends SalesforceModel
{
protected $objectName = 'Account'; // Salesforce API name
protected $primaryKey = 'Id'; // Salesforce ID field
}
First Query
$accounts = Account::where('Name', 'like', 'Acme%')->get();
Leverage familiar Eloquent syntax for Salesforce operations:
// Create
$account = Account::create(['Name' => 'Acme Corp', 'Industry' => 'Technology']);
// Read
$account = Account::find('001XXXXXXXXXXXXXXX');
$accounts = Account::where('AnnualRevenue', '>', 1000000)->take(10)->get();
// Update
$account->update(['Industry' => 'Software']);
// Delete
$account->delete();
Define relationships using Eloquent conventions (supports belongsTo, hasMany, hasOne, etc.):
class Contact extends SalesforceModel
{
protected $objectName = 'Contact';
public function account()
{
return $this->belongsTo(Account::class, 'AccountId', 'Id');
}
}
// Usage
$contact = Contact::find('003XXXXXXXXXXXXXXX');
$account = $contact->account; // Eager-loaded if needed
Use chunk() or cursor() for large datasets:
Account::where('Industry', 'Technology')->chunk(200, function ($accounts) {
foreach ($accounts as $account) {
// Process each account
}
});
Execute raw SOQL via query():
$results = Account::query("SELECT Id, Name, BillingCity FROM Account WHERE Industry = 'Technology' LIMIT 100");
Use Eloquent observers for lifecycle hooks:
// app/Observers/AccountObserver.php
class AccountObserver
{
public function saved(Account $account)
{
// Post-save logic (e.g., log, notify)
}
}
// Register in a service provider
Account::observe(AccountObserver::class);
Fetch Salesforce metadata dynamically:
$fields = Account::getFields(); // Returns array of field names
$describes = Account::describe(); // Returns full Salesforce object metadata
AnnualRevenue), but Eloquent defaults to snake_case.$fillable or $guarded to match Salesforce API names:
protected $fillable = ['Name', 'AnnualRevenue']; // Not 'annual_revenue'
001XXXXXXXXXXXXXXX).Id as the primary key.chunk() or enable the Bulk API via config:
'bulk_api' => [
'enabled' => true,
'batch_size' => 10000,
],
with() for eager loading:
$account = Account::with('contacts')->find('001XXXXXXXXXXXXXXX');
try-catch for API-specific errors:
try {
$account = Account::find('invalid_id');
} catch (\Daikazu\SalesforceObjects\Exceptions\SalesforceException $e) {
Log::error($e->getMessage());
}
$fields = Cache::remember('account.fields', now()->addHours(1), function () {
return Account::getFields();
});
select() to limit fetched fields:
$accounts = Account::select(['Id', 'Name'])->get();
$this->mock(SalesforceClient::class, function ($mock) {
$mock->shouldReceive('query')
->once()
->andReturn(['records' => []]);
});
Daikazu\SalesforceObjects\Eloquent\Builder for reusable logic.getAuth() in your model for OAuth2 or JWT flows.salesforce-objects/events to listen for Salesforce platform events.How can I help you explore Laravel packages today?