Neos Flows default persistence layer is based on Doctrine ORM which is super great for DDD and modelling your data!
The ORM brings some great mechanism in regards of annotations and migration creation. And to do this in high speed, there is a number of calculations and objects creation to go through with each query.
But, sometimes you wan’t to perform a old school regular SELECT COUNT(*) FROM table
query, for a statistic or report. With ORM and the default Query
object from your repository you can do something like
public function countAllForStatistic(): int
{
$query = $this->createQuery();
return $query->count()
}
This is great, but will start the whole ORM layer to create the query.
Access the database directly
But, since we are build on top of Doctrine ORM – which again is based on Doctrine DBAL – we can access the connection to the database directly.
With Neos Flow 7 came a connection factory that we can inject as such
<?php
namespace Vendor\Application\Service;
use Neos\Flow\Annotations as Flow;
use Doctrine\DBAL\Connection;
class StatisticService
{
/**
* @Flow\Inject
* @var Connection
*/
protected $databaseConnection;
public function countNewSinceDay(): int
{
return $this->databaseConnection->executeQuery("SELECT COUNT(*) FROM table");
}
}
Example package available
I created a example example package to show how this works (described in the pull request linked above)
https://github.com/sorenmalling/Vendor.TestConnectionFactory