netdudes / data-sourcery-bundle
Netdudes DataSourceryBundle
Installs: 7 189
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 5
Forks: 1
Open Issues: 2
Type:symfony-bundle
Requires
- php: >=7.0
- doctrine/doctrine-bundle: ^1.6
- doctrine/orm: ^2.5
- symfony/symfony: >=2.3
Requires (Dev)
This package is auto-updated.
Last update: 2020-08-11 18:48:35 UTC
README
****** WARNING: THIS PROJECT IS NO LONGER MAINTAINED!! ******
Netdudes\DataSourceryBundle
DataSourceryBundle is a neat tool to handle building and performing complex queries on data sets, including support for natural-language queries and safe handling of user provided query parameters.
Usage (work in progress!)
Assume we have one entity in our system managed by Doctrine, called User
, that looks like this:
User {
string username
string nameFirst
string nameLast
\DateTime registered
User bestFriend => OtM with another user
User worstEnemy => OtM with another user
}
You can get the building block of the library, the DataSource
, from a builder. From here and now on we will assume you have a DI container (e.g. Symfony) where the needed services are registered.
$dataSourceBuilder = $container ->get('netdudes_data_sourcery.data_source.factory') ->createBuilder('My\Entities\User');
With a builder is easy to create a Datasource
$dataSourceBuilder ->addField('username', 'string', 'username') ->addField('bestFriendUsername' 'string', 'bestFriend.username') ->addField('worstEnemyUsername', 'string', 'worstEnemy.username') ->addField('friendOfMyEnemyUsername', 'string', 'worstEnemy.bestFriend.username') ->addField('registered', 'date', 'registered'); $dataSource = $dataSourceBuilder->build();
Alternatively, a data source can be generated from a configuration class, very similarly to how Symfony Forms are built.
class MyNiceDataSourceConfig implements DataSourceConfigurationInterface { public function getEntityClass() { return 'My\Entities\User'; } public function buildDataSource(DataSourceBuilderInterface $builder) { $builder ->addField('username', 'string', 'username') ->addField('bestFriendUsername', 'string', 'bestFriend.username') ->addField('worstEnemyUsername', 'string', 'worstEnemy.username') ->addField('friendOfMyEnemyUsername', 'string', 'worstEnemy.bestFriend.username') ->addField('registered', 'date', 'registered'); } } $dataSource = $container ->get('netdudes_data_sourcery.data_source.factory') ->createFromConfiguration(new MyNiceDataSourceConfig());
In order to query you data source, you must have a Query
object. Creating one manually is easy:
$query = new Query(); $query->setSelect(['username', 'bestFriendUsername', 'worstEnemyUsername', 'friendOfMyEnemyUsername', 'registered']); $filter = new Filter( [ new FilterCondition('username', FilterCondition::METHOD_STRING_EQ, 'admin') ] ); $query->setFilter($filter);
Alternatively you can use the built in parser for the system's language, UQL:
$uqlInterpreter = $container->get('netdudes_data_sourcery.uql.interpreter.factory')->create($dataSource); $filter = $uqlInterpreter->generateFilters('username != "admin"'); $query->setFilter($filter);
Finally, you can get your data from the data source
$data = $dataSource->getData($query); dump($data);
Giving
array:1 [ 0 => array:5 [ "username" => "admin" "bestFriendUsername" => "Max" "worstEnemyUsername" => "John" "friendOfMyEnemyUsername" => "Max" "registered" => DateTime {#124 +"date": "2014-02-01 00:00:00.000000" +"timezone_type": 3 +"timezone": "Europe/Berlin" } ] ]