rob-lester-jr04/eloquent-sales-force
Installation:
composer require rob-lester-jr04/eloquent-sales-force
Publish the config file:
php artisan vendor:publish --provider="RobLester\ElSF\ElSFServiceProvider" --tag="config"
Configure .env:
Add Salesforce credentials to your .env:
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 sandbox
First Use Case:
Define a model extending RobLester\ElSF\ElSFModel:
use RobLester\ElSF\ElSFModel;
class Account extends ElSFModel
{
protected $objectName = 'Account'; // Salesforce object name
}
Query Salesforce data like Eloquent:
$accounts = Account::where('Name', 'like', 'Acme%')->get();
CRUD Operations: Use Eloquent syntax for Salesforce records:
// Create
$account = Account::create(['Name' => 'Acme Corp']);
// Read
$account = Account::find('001XXXXXXXXXXXX');
// Update
$account->update(['Industry' => 'Technology']);
// Delete
$account->delete();
Relationships: Define polymorphic relationships (Salesforce doesn’t support traditional Eloquent relationships):
class Contact extends ElSFModel
{
protected $objectName = 'Contact';
public function account()
{
return $this->belongsTo(Account::class, 'AccountId');
}
}
Bulk Operations:
Use chunk() for large datasets to avoid API limits:
Account::where('Industry', 'Technology')->chunk(200, function ($accounts) {
foreach ($accounts as $account) {
// Process batch
}
});
Custom Fields:
Map custom fields via $fillable or $attributes:
class CustomObject extends ElSFModel
{
protected $objectName = 'Custom_Object__c';
protected $fillable = ['Custom_Field__c', 'Another_Field__c'];
}
SOQL Queries: Use raw SOQL for complex queries:
$results = Account::query()->from("SELECT Id, Name FROM Account WHERE AnnualRevenue > 1000000");
ElSFServiceProvider (configured in .env).try {
$account = Account::find('001XXXXXXXXXXXX');
} catch (\RobLester\ElSF\Exceptions\SalesforceException $e) {
Log::error($e->getMessage());
}
$accounts = Cache::remember('accounts', 3600, function () {
return Account::all();
});
API Limits:
chunk() or cursor() for large datasets.Account::cursor()->each(function ($account) {
// Process one record at a time
});
Field Naming:
__c suffix for custom fields (e.g., Custom_Field__c). Ensure your model’s $fillable matches this.$fields = Account::getFields(); // Returns array of valid fields
Timeouts:
setConnectionTimeout():
Account::setConnectionTimeout(60); // 60 seconds
Soft Deletes:
class Account extends ElSFModel
{
public function scopeActive($query)
{
return $query->where('IsDeleted', false);
}
}
Data Type Mismatches:
Date vs. string). Cast fields explicitly:
protected $casts = [
'CreatedDate' => 'datetime',
'AnnualRevenue' => 'float',
];
Enable Logging:
Add to .env:
SALESFORCE_LOG_LEVEL=debug
Logs will appear in storage/logs/laravel.log.
SOQL Debugging:
Use toSql() to inspect generated SOQL:
$query = Account::where('Industry', 'Technology');
dd($query->toSql());
Token Refresh:
If you get INVALID_SESSION_ID, refresh the OAuth token:
$this->app['RobLester\ElSF\ElSFServiceProvider']->refreshToken();
Custom Adapters:
Extend RobLester\ElSF\Adapters\SalesforceAdapter for custom API logic.
Event Listeners:
Listen to Salesforce events (e.g., created, updated):
Account::created(function ($account) {
// Post-create logic
});
Custom Queries:
Override newQuery() for object-specific behavior:
class Account extends ElSFModel
{
public function newQuery()
{
$query = parent::newQuery();
$query->with(['customScope']);
return $query;
}
}
Bulk API: For high-volume operations, use the Salesforce Bulk API:
Account::bulk()->insert($accounts);
How can I help you explore Laravel packages today?