Como desarrollador PHP, es probable que hayas escuchado el término ORM. ORM es una forma de trabajar con base de datos de la misma manera que trabajas con clases y objetos. Si exploras cómo las aplicaciones web están diseñadas y construidas, después de explorar intensamente en sus ORM notarás que están construidas usando dos patrones: Active Record y Data Mapper.
Active Record permite vincular un objeto con un registro en una base de datos. Es cierto, cada registro o fila en una base de datos esta vinculada con un objeto. Cuando tu obtienes una fila de una base de datos puedes actualizarla, eliminarla o almacenarla usando el objeto mismo. Esa es la manera como trabajan Eloquent y Paris, y como está construido Ruby on Rails.
Por otra parte, Data Mapper es una capa de software que separa los objetos en memoria de los que se encuentran en la base de datos. Con Data Mapper los objetos en memoria no necesitan ni siquiera saber si hay existe una base de datos. No necesitas interfaz SQL o conocimiento del esquema de la base de datos. Una de dichas soluciones es Doctrine.

¿Qué es Doctrine?

Doctrine es un ORM que implementa el patron Data Mapper y permite crear una separación clara entre las reglas de negocio de la aplicación y la capa persistente de la base de datos.
Algunas de las ventajas de ORM que he descubierto son:
Más rápido y fácil de usar.
Entidades son solo objetos planos.
Doctrine usa el enfoque code first, así que puedes primero crear entidades, y luego generar una base de datos para ellos automáticamente. El caso contrario es posible, pero no recomendado.
Soporta anotaciones, XML y YAML para el esquema de base de datos.
DQL(un reemplazo de SQL) realiza la abstracción de tus tablas.
Los eventos de Doctrine permiten fácilmente detectar eventos específicos de base de datos y realizar ciertas acciones.
Los repositorios son más fieles al patrón Repository.
La metodología transaccional write-behind permite a Doctrine tener menor interacción con la base de datos hasta que realice una llamada explícita al método flush().
Por cierto, Doctrine tiene también sus desventajas, pero queda a criterio del programador hacer uso del correcto ORM

Doctrine DQL

DQL significa Doctrine Query Language(Lenguaje de consultas de Doctrine). DQL incluye el lenguaje de creación de query a través de objetos, lo que significa que en lugar de las consultas tradicionales, podrás realizar consultas usando objetos.
DQL permite escribir consultas a base de datos usando objetos, lo que es de ayuda cuando necesitas realizar consultas que de otra manera no podrías usando los métodos tradicionales.
Consulta DQL de ejemplo:

Filtros Doctrine

Doctrine permite limitar los resultados haciendo uso de filtros. Por ejemplo, si buscas editar solo la información de un usuario que ha iniciado sesión o deseas asegurar que la información del cliente actual ha sido obtenido de la base de datos.
Aquí un ejemplo:
Como puedes ver en la entidad User, el resultado de JoinColumn está limitado solo a los registros que cumplan con la condición WHERE user_id = :user_id.