So what i ended up doing, was eager loading the polymorphic relationship manually. Instead of using the with method, i would get all the Packages, and their id and type. I would then filter through the info and create a new query for each model type and use the whereIn method to only load the models that met the Package queries expectations. The queries performed are basically the same that Laravel uses, the only difference, is that I'm now able to constrain the eager loaded relationship.
In case anyone is interested or happens to come across the same problem, here is an example:
$packages = Package::all();
// First we group by type. This is prep for using the lists method. You'd think we could use that right at the beginning, but we can't use the type as the key, since that would result in each subsequent item of the same relation overriding the last one. We can't use the id either, since packages of different types could easily have the same id. So we group them by type first.
$packages = $packages->groupBy('package_type');
// Then we loop through all the package types, with the type being the key.
$packageTypes = [];
foreach($packages->all() as $type => $packages) {
$collection = new Collection($packages);
// Now we get the list of id's
$packageIds = $collection->lists('package_id');
// And store them with the type holding an array of it's corresponding ids
packageTypes[$name] = $packageIds;
}
$packageResults = new Collection();
// We loop through the types and create a new model for each one.
foreach($this->packageTypes as $name => $ids) {
$model = new $name;
// We get model instances that match our id, and here you can scope/constrain the query all you want for your eager loaded models. To end, i push the results onto a new collection.
$packageResults->push($model->whereIn('id', $ids)->available($bookingDate)->get());
}