#7119·dbal

setMaxResults() does not apply LIMIT in QueryBuilder on delete.

Author: rokas-reizgys-tgCreated Aug 29, 2025Updated Aug 18, 2026

Bug Report

Q A
Version 4.3.2
Previous Version if the bug is a regression x.y.z

Summary

Found an issue with setMaxResults() method with DELETE query. Regarding to Doctrine official docs, I assume that LIMIT clause is supported by doctrine and should be added when build a query with QueryBuilder. But in my case - it is not a case. When i found out that this does not limit the records - I tried adding setFirstResult(0), but it did not help. Here is my code and printed SQL query using getSQL():

Code:

        $query = $this->dbal
            ->createQueryBuilder()
            ->delete($this->table->getTableName())
            ->where('created_at < :retention_date')
            ->andWhere('status = :status')
            ->setParameter('retention_date', $retentionDate, Types::DATETIME_IMMUTABLE)
            ->setParameter('status', MessageStatus::HANDLED->value)
            ->setFirstResult( 0 )
            ->setMaxResults(50)
        ;

Generated query:

DELETE FROM messenger_messages_outbox_storage WHERE (created_at < ?) AND (status = ?)

This code is expected to delete 50 records with LIMIT clause applied. Expected query:

DELETE FROM messenger_messages_outbox_storage 
WHERE (created_at < ?) AND (status = ?) 
LIMIT 50