NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #2007 most downloaded on Packagist
Integrate Doctrine ORM into the SonataAdminBundle
Last release 9 months ago
05 Jan 2026
Release timing varies
gaps range from 2 weeks to 10 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
14 years old
122 releases · first in 2013
[ #1858 ] The symfony/security-acl dependency is now optional. You need to explicitly require it as a dependency if you are using ACL. ( @dmaicher )
[ #1852 ] Support for Symfony 8 ( @dmaicher )
One column per quarter.
[ #1840 ] Fixed Doctrine ClassMetadata reflFields deprecation ( @VincentLanglet )
[ #1826 ] Support for doctrine/persistence ^4.0 ( @dmaicher )
[ #1807 ] DateTimeRangeFilter when both the start or end field are not empty. ( @VincentLanglet )
start or end field are not empty. (@VincentLanglet)[ #1805 ] Allow to pass extra field options in ClassFilter ( @VincentLanglet )
[ #1803 ] UidFilter global_search default value ( @VincentLanglet )
global_search default value (@VincentLanglet)ModelFilter (@core23)[ #1796 ] Compatibility with doctrine/dbal 4 and doctrine/orm 3 ( @dmaicher )
[ #1780 ] Support for Symfony 7. ( @jordisala1991 )
[ #1767 ] DateTimeRangeFilter exception occurs when either the start or end field is empty. ( @tonyaxo )
[#1768] Guessing for enum types (@phansys)
[#1755] Support for sonata-project/form-extensions 2.0 (@jordisala1991)
sonata-project/form-extensions 2.0 (@jordisala1991)symfony/uid as primary keys using Uuid or Ulid (@jordisala1991)ModelFilter for related entities using compound ids (@jordisala1991)ModelFilter when filtering for not equals and using an inverse side relation (@jordisala1991)[#1737] Bump sonata-project/form-extensions to ^1.19 (@jordisala1991)
sonata-project/form-extensions to ^1.19 (@jordisala1991)[#1734] Exception message at ModelManager::batchDelete() in order to provide more details about the failed batch operation (@phansys)
ModelManager::batchDelete() in order to provide more details about the failed batch operation (@phansys)doctrine/common (@jordisala1991)[#1714] Drop support for doctrine/dbal ^2.0. (@jordisala1991)
doctrine/dbal ^2.0. (@jordisala1991)doctrine/persistence ^2.0. (@jordisala1991)[#1690] ProxyQuery and ProxyQueryInterface are covariant (@VincentLanglet)
[#1703] Passing a null offset to AuditReader::findRevisionHistory (@VincentLanglet)
AuditReader::findRevisionHistory (@VincentLanglet)[#1695] Fix batch delete on entities with json columns on PostgreSQL. (@jordisala1991)
[#1691] ModelManager::supportsQuery now supports AbstractQuery (@djpretzel)
[#1687] Generics for ProxyQueryInterface and ProxyQuery (@VincentLanglet)
[#1685] SonataAdminBundle 4.17 deprecations. (@VincentLanglet)
[#1680] Support for sonata-project/exporter ^3 (@VincentLanglet)
[#1677] Display of advanced filter for CounterFilter, NumberFilter, StringFilter and StringListFilter. (@VincentLanglet)
[#1674] Fix missing 'operator_type' array value returned in AbstractDateFilter:: getFormOptions() bug to avoid not rendered advanced filter options in
AbstractDateFilter:: getFormOptions() bug to avoid not rendered advanced filter options in DateFilter or DateTimeFilter. (@davidromani)[#1669] Solved deprecation with SonataAdminBundle 4.14 (@VincentLanglet)
[#1656] Added support for doctrine/persistence 3 (@dmaicher)
[#1646] The lastpage is correctly set to 1 when there is no results. (@VincentLanglet)
[#1641] Register EmptyFilter as a service (@willemverspyck)
[#1639] Add "sortBy" entity to "select" part of DQL to fix sorting on ManyToOne column (@willemverspyck)
[#1637] Fixed smart pagination disabling output walkers when the orderBy is set to a ToMany at proxy level. (@jordisala1991)
[#1589] Overrideing the built-in form and filter theme (@1ed)
[#1631] Support for the model_class attribute for sonata admin classes in AddAuditEntityCompilerPass. (@nocive)
[#1616] Disabling output walkers when paginating with order by from an association (@franmomu)
[#1583] Paginator set useOutputWalkers to false for query with joins (@ossinkine)
[#1562] Added support for Symfony 6. (@jordisala1991)
CallbackFilter datagrid filter. (@toooni)[#1558] Added support for Doctrine DBAL 3. (@jordisala1991)
field_options are automatically passed to the Filter when an EntityType or a ModelAutocompleteType is used. (@VincentLanglet)ModelAutocompleteFilter in favor of ModelFilter with a field_type ModelAutocompleteType (@VincentLanglet)ModelManager::getEntityManager() (@VincentLanglet)[#1523] Do not set a default route option to FieldDescription in FieldDescriptionFactory (@VincentLanglet)
FieldDescription in FieldDescriptionFactory (@VincentLanglet)[#1510] AuditReader compatibility with sonata-admin@4.0.0-rc.2 (@VincentLanglet)
AuditReader compatibility with sonata-admin@4.0.0-rc.2 (@VincentLanglet)[#1458] EmptyFilter (@VincentLanglet)
EmptyFilter (@VincentLanglet)Pager::getCurrentPageResults() does not return Paginator anymore. (@VincentLanglet)[#1412] Add compatiblity with all SonataAdmin 4.0 versions (@jordisala1991)
FilterData instead of array in filters. (@VincentLanglet)See Changelog
See Changelog
[#1635] Fixed smart pagination disabling output walkers when the orderBy is set to a ToMany at proxy level. (@jordisala1991)
[#1623] Disabling output walkers when paginating with order by from an association (@krewetka)
[#1585] Paginator set useOutputWalkers to false for query with joins (@JustDylan23)
[#1473] Deprecation from SonataAdminBundle 3.x (@dmaicher)
global_search option to the StringFilter (@VincentLanglet)treat_null_as option to BooleanFilter (@VincentLanglet)GroupableConditionAwareInterface (@VincentLanglet)Filter objects (@VincentLanglet)Filter::$groupedOrExpressions (@VincentLanglet)ChoiceTypeFilter for global search (@VincentLanglet)Filter::$groupedOrExpressions static property (see sonata-project/SonataAdminBundle#7096) (@VincentLanglet)[#1455] Export for admin with fetch join in the configureQuery() method (@VincentLanglet)
configureQuery() method (@VincentLanglet)[#1444] Fixed issue where pagination of large dataset would take very long time or cause database engine to swap even for simplest queries without joi
[#1439] Bind arbitrary params as part of a value expression in the query filter at Filter::applyWhere() with PostgreSQL. (@phansys)
[#1428] Deprecated not adding FilterData as type declaration of argument 4 in the callable passed to CallbackFilter (@franmomu)
ProxyQuery::execute() is now returning a Paginator instead of an array. (@VincentLanglet)templates.form and templates.filter config (@VincentLanglet)FilterData as type declaration of argument 4 in the callable passed to CallbackFilter (@franmomu)SonataDoctrineORMAdmin form and filter templates. (@VincentLanglet)sonata_admin configuration. (@VincentLanglet)[#1399] Fixed triggering always deprecation when calling ModelManager::getDefaultSortValues() method (@franmomu)
[#1393] Added missing filter declaration in the config (@VincentLanglet)
[#1341] Deprecated the Sonata\DoctrineORMAdminBundle\Filter\EmptyFilter service since its class is already deprecated since version 3.27 (@dmaicher)
ModelManager::reverseTransform() (@VincentLanglet)FieldDescriptionFactory class (@VincentLanglet)Sonata\DoctrineORMAdminBundle\Filter\EmptyFilter service since its class is already deprecated since version 3.27 (@dmaicher)ModelManager::modelReverseTransform() (@VincentLanglet)AbstractTypeGuesser class (@VincentLanglet)FilterTypeGuesser::guessType() (@VincentLanglet)TypeGuesser::guessType() (@VincentLanglet)ModelManager:: getParentMetadataForProperty() (@VincentLanglet)ModelManager:: getNewFieldDescriptionInstance() (@VincentLanglet)ModelManager:: getModelInstance() (@VincentLanglet)FieldDescriptionInterface methods (@franmomu)WHERE clause from Filter::applyWhere() when using OR conditions on queries that already have previous conditions (@phansys)trigger_error() (@phansys)[#1333] Deprecate passing arguments to ProxyQuery::execute() method (@VincentLanglet)
Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface::getDoctrineQuery() (@VincentLanglet)ProxyQuery::execute() method (@VincentLanglet)Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface as argument 2 of ModelManager::addIdentifiersToQuery() (@VincentLanglet)Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface as argument 2 of ModelManager::batchDelete() (@VincentLanglet)Sonata\DoctrineORMAdminBundle\Datagrid\OrderByToSelectWalker (@VincentLanglet)Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery::getFixedQueryBuilder() (@VincentLanglet)Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery::getSingleScalarResult() (@VincentLanglet)ManagerRegistry as first argument of ObjectAclManipulator (@VincentLanglet)[#1314] Unavoidable deprecation about the code option (@VincentLanglet)
type value to a filter than an integer handled (@VincentLanglet)code option (@VincentLanglet)ChoiceFilter returns null values when used with the type NOT_EQUAL (@VincentLanglet)[#1292] Extending ProxyQuery (@VincentLanglet)
ProxyQuery (@VincentLanglet)DataSource (@VincentLanglet)CountFilter (@VincentLanglet)[#1280] Added CountFilter. (@rgrassian)
CountFilter. (@rgrassian)Pager::CONCAT_SEPARATOR (@VincentLanglet)null field_type option for Filter (@VincentLanglet)[#1262] Deprecated Pager::getResults() (@VincentLanglet)
Sonata\AdminBundle\Datagrid\PagerInterface::countResults() (@dmaicher)Sonata\DoctrineORMAdminBundle\Filter\NullFilter (@pbories)Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface (@VincentLanglet)DataSourceInterface implementation (@VincentLanglet)<a> with empty href to button (@axzx)FieldDescription::fieldName is changed from bar to the correct value foo.bar (@VincentLanglet)Sonata\DoctrineORMAdminBundle\Datagrid\Pager::computeNbResult() (@dmaicher)Sonata\DoctrineORMAdminBundle\Datagrid\Pager::getNbResults() (@dmaicher)Sonata\DoctrineORMAdminBundle\Datagrid\Pager::setNbResults() (@dmaicher)Sonata\DoctrineORMAdminBundle\Filter\EmptyFilter (@pbories)ModelManager::getMetadata() method (@VincentLanglet)ModelManager::hasMetadata() method (@VincentLanglet)Sonata\DoctrineORMAdminBundle\Model\ModelManager::modelTransform() with no replacement (@VincentLanglet)Sonata\DoctrineORMAdminBundle\Model\ModelManager::getDefaultPerPageOptions() with no replacement (@VincentLanglet)Sonata\DoctrineORMAdminBundle\Model\ModelManager::getDefaultSortValues() with no replacement (@VincentLanglet)Sonata\DoctrineORMAdminBundle\Model\ModelManager::getDataSourceIterator() with no replacement (@VincentLanglet)ProxyQueryInterface which is not an instance of Sonata\DoctrineORMAdminBundle\Datagrid::ProxyQuery as argument 1 to the Sonata\DoctrineORMAdminBundle\Filter\Filter::filter() method (@VincentLanglet)[#1207] Added an option inverse for the EmptyFilter filter (@VincentLanglet)
inverse for the EmptyFilter filter (@VincentLanglet)[#1202] Added "Not equal" filter for StringFilter (@VincentLanglet)
StringFilter (@VincentLanglet)\DateTimeImmutable at AbstractDateFilter::filter() (@phansys)ModelManager::addIdentifiersToQuery() is not an empty array (@phansys)FormContractor::getDefaultOptions() passes collection_by_reference option instead of by_reference to AdminType in order to respect the new API (@VincentLanglet)AbstractDateFilter::filter() (@phansys)TypeError thrown by explode() when receiving non string values as argument 2 from argument 3 at ModelManager::addIdentifiersToQuery() (@phansys)[#1142] FormContractor::getDefaultOptions() pass by_reference from CollectionType to AdminType (@VincentLanglet)
FormContractor::getDefaultOptions() pass by_reference from CollectionType to AdminType (@VincentLanglet)ModelManager::supportsQuery() method (@VincentLanglet)doctrine/persistence 2 (@franmomu)executeQuery() on something else than an instance of Doctrine\ORM\QueryBuilder or Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery (@VincentLanglet)Your coding agent can read these notes before it upgrades. Set up the MCP server →