I added this method to Packages, so you can look for a package based on meta fields.
It even includes some hackery to look up values in serialized data.
/**
* Searches packages that contain the given meta field
*
* @param string $key They service field key to search
* @param string $value The service field value to search
* @param string $subkey The key to look for in serialised meta
* @return array An array of stdClass objects, each containing a service
*/
public function searchPackageMeta($key, $value, $subkey=null) {
$module_id=1;
$this->Record = $this->getPackages();
$qry = $this->Record->innerJoin("package_meta", "package_meta.package_id", "=", "packages.id", false)->
group("packages.id")->
where("package_meta.key", "=", $key)->
where("package_meta.value", "=", $value);
if($subkey) {
return $qry->orLike("package_meta.value", sprintf('%%s:%d:"%s";s:%d:"%s";%%', strlen($subkey), $subkey, strlen($value), $value))->fetchAll();
} else {
return $qry->orLike("package_meta.value", sprintf('%%:%%:%%;s:%d:"%s";%%', strlen($value), $value))->fetchAll();
}
}
Example usage:
find packages that include .com NameCheap domains.
blesta.api('packages/searchPackageMeta', {'key': 'tlds', 'value': '.com'})
Find all SSL certificates
blesta.api('packages/searchPackageMeta', {'key': 'type', 'value': 'ssl'})
Get all 33" washing machines
blesta.api('packages/searchPackageMeta', {'key': 'dimensions', 'value': '33', 'subkey': 'diameter'})