NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #1760 most downloaded on Packagist
A fully-featured LDAP ORM.
Last release 3 days ago
04 Oct 2026
Ships fairly regularly
a new release about every 5 weeks
Rarely documented
notes for 13 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
7 years old
174 releases · first in 2019
OpenLDAP Argon2 password support and a new User::changePassword() method for self-service password changes - #809
User::changePassword() method for self-service password changes - #809PHP 8.5 ReflectionProperty deprecations by @RadioTrista - #812
One column per quarter.
Auth: allow zero string credentials by @tbasten - #810
Global scope query mutations - #806
Nested filter grouping regression - #805
Fix date attributes producing invalid UNIX timestamps on 32-bit PHP - #803
Add laravel 13 support by @felipereisdev - #796
Align model query builder filter behaviour with root query builder - #793
Corrected select behaviour to align with v3 - #792
https://ldaprecord.com/docs/core/v4/release-notes
We're excited to announce the release of LdapRecord v4.0.0! This major version introduces significant improvements to the query filter system, clearer SSL/TLS configuration naming, and better separation of concerns between the query and model builders.
The SSL and TLS configuration options have been renamed to more accurately reflect their purpose:
use_ssl is now use_tls - Uses the ldaps:// protocol (port 636)
use_tls is now use_starttls - Uses the ldap:// protocol with STARTTLS upgrade (port 389)
The previous naming was confusing because use_ssl actually enabled TLS via the ldaps:// protocol, while use_tls enabled STARTTLS. The new names make this distinction clear.
The query filter system has been completely rewritten to use dedicated filter objects instead of arrays and a grammar class. This provides a more intuitive and type-safe way to work with LDAP filters.
New Filter Classes:
Class Description Example
Equals Exact match (cn=John)
Contains Substring match (cn=John)
StartsWith Prefix match (cn=John*)
EndsWith Suffix match (cn=*Doe)
Has Attribute presence (cn=*)
GreaterThanOrEquals Greater than or equal (age>=18)
LessThanOrEquals Less than or equal (age<=65)
ApproximatelyEquals Approximate match (cn~=John)
AndGroup AND group (&(cn=John)(sn=Doe))
OrGroup OR group (|(cn=John)(cn=Jane))
Not Negation (!(cn=John))
Raw Raw filter string Any valid filter
All condition filters implement the ConditionFilter interface, and all group filters implement the GroupFilter interface, making it easy to work with parsed filters programmatically.
The where and orWhere methods now accept closures as the first argument for nested queries, providing a more intuitive way to build complex filters:
User :: query () -> where ( function ($query) { $query -> where ( 'cn' , '=' , 'John' ) -> orWhere ( 'cn' , '=' , 'Jane' ) ; } ) -> get () ; Copy Copied!
The Model\Builder class no longer extends Query\Builder . Instead, it uses composition, delegating query operations to an underlying Query\Builder instance. This provides:
Better separation of concerns
Clearer APIs for each builder type
More predictable behavior when extending builders
You can access the underlying query builder using getQuery() or toBase() methods.
Parameter names have been standardized throughout the codebase to better align with LDAP terminology:
$fields is now $attributes
$columns is now $selects
The filter parser now returns typed filter objects instead of generic node classes:
use LdapRecord \ Query \ Filter \ Parser ; $filters = Parser :: parse ( '(&(cn=Steve)(sn=Bauman))' ) ; $group = $filters[ 0 ]; // AndGroup instance $group -> getOperator () ; // "&" $group -> getFilters () ; // [Equals, Equals] Copy Copied!
For detailed upgrade instructions, please see the upgrade guide .
Laravel 13 compatibility for v3.0 - #798
Properly return no results when ->whereIn() is called on query builder with an empty array - #783
->whereIn() is called on query builder with an empty array - #783Rounding error when retrieving timestamp from Active Directory #779
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →