Query related models located on different database connections using whereHas() without cross-database join errors.
When your application partitions data across multiple database connections (such as separating analytics logs, multi-tenant tenants, or payment microservices onto different database servers), standard SQL joins between connection tables fail.
Eloquent's whereHas() directly handles relations across different database connections.
Defining Models on Separate Connections
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Tenant extends Model
{
protected $connection = 'main_db';
public function activityLogs(): HasMany
{
return $this->hasMany(ActivityLog::class);
}
}
class ActivityLog extends Model
{
// Stored on a separate logging database server
protected $connection = 'logging_db';
}
Querying Across Connections with whereHas()
use App\Models\Tenant;
// Eloquent handles the cross-connection query correctly
$activeTenants = Tenant::whereHas('activityLogs', function ($query) {
$query->where('created_at', '>=', now()->subDays(7));
})->get();
Summary
- Enables relational querying even when models reside on distinct database servers.
- Uses
WHERE EXISTSqueries scoped by database name. - Eliminates manual cross-database ID querying loops.
Related Tips
View all tips →Use sole() Instead of firstOrFail() for Single Record Guarantees
When you expect exactly one matching record, use sole() instead of firstOrFail(). It guards against multiple records by throwing MultipleRecordsFoundException.
Optimize Date Queries by Replacing whereYear() with whereBetween()
Replace whereYear() and whereMonth() on large database tables with whereBetween() date ranges to enable SQL index lookups.