public function execute($option = HydratorInterface::HYDRATE_AUTO)
{
//execute before events and proceed with builder from event
$provider = $this->createProvider($this->getEntity());
$event = $this->beforeExecute($provider->getEntity());
if ($event->isCanceled()) {
return false;
}
$builder = $event->getBuilder();
//convert entity to adapter again
$provider = $this->createProvider($builder->getEntity());
$connection = $this->getConnection();
$isSelect = $builder->getType() === QueryBuilder::SELECT;
$sql = $this->getSQL();
$statement = $isSelect ? $connection->executeQuery($sql, $this->getParameters(), $this->getParameterTypes()) : $connection->executeUpdate($sql, $this->getParameters(), $this->getParameterTypes());
//execute after events and proceed with result from event
$event = $this->afterExecute($isSelect ? $statement->fetchAll() : $statement, $provider->getEntity(), $builder);
if ($event->isCanceled()) {
return false;
}
$result = $this->convertTypesToPHPValues($provider, $event->getResult());
$data = (new EntityHydrator($provider))->hydrate($result, $option);
gc_collect_cycles();
return $data;
}