Dump a una entidad sin desbordar la memoria:
\Doctrine\Common\Util\Debug::dump($entity);
Anotaciones:
//Ordenar por defecto cuando hacemos por ejemplo $user->getComments()
Class User
{
//..
/**
* @ORM\OneToMany(targetEntity=Comment::class, mappedBy="users")
* @ORM\OrderBy({"createdAt" = "DESC"})
*/
private $comments;
//EXTRA LAZY: si solo vamos a contar la cantidad de elementos, por ejemplo en twig:
// user.comments|lengh
//Podria ser veneficioso incluir la anotación EXTRA_LAZY, que solo hace una consulta sql COUNT, que es más rapida que traer todos los comentarios y luego hacer una consulta más para contarlo. Como contra, cuando traemos comantarios para mostrarlos la consulta COUNT siempre estara presente.
/**
* @ORM\OneToMany(targetEntity=Comment::class, mappedBy="users", fetch="EXTRA_LAZY")
* @ORM\OrderBy({"createdAt" = "DESC"})
*/
private $comments;
Criterias:
//Las Criterias son útiles para agregar condiciones en las consultas
//En la clase repositorio de Comments
//Agregamos una Criteria de solo los comentarios no borrados
public static function createNonDeletedCriteria(): Criteria
{
return Criteria::create()
->andWhere(Criteria::expr()->eq('isDeleted', false))
->orderBy(['createdAt' => 'DESC'])
;
}
//Luego la podemos llamar en un método del repositorio
public function findAllPublished()
{
$qb = $this->createQueryBuilder('a')
->addCriteria(self::createNonDeletedCriteria());
return $qb
->getQuery()
->getResult()
;
}
//tambien la podemos llamar en un método en la entidad
Class Comment
{
//...
public function getNonDeletedComments(): Collection
{
$criteria = CommentRepository::createNonDeletedCriteria();
return $this->comments->matching($criteria);
}
Solucionar problema N+1 en consultas con JOIN:
//Clase repositorio
public function findAllWithSearch(?string $term)
{
$qb = $this->createQueryBuilder('c')
->innerJoin('c.article', 'a')
->addSelect('a'); -> Esta line hace que se consigan los items en la misma consulta
}
Tipos de mapeo de datos en Doctrine:
Strings
1. string (para textos cortos): este tipo mapea un SQL VARCHAR a un string de PHP.
2. text (para textos largos): este tipo mapea un SQL CLOB a un string de PHP.
Números
1. integer (entero): este tipo mapea un SQL INT a un entero de PHP.
2. smallint (entero corto): este tipo mapea un SMALLINT en la base de datos a un entero de PHP.
3. bigint (entero largo): este tipo mapea un BIGINT en la base de datos a un entero de PHP.
4. decimal (número decimal): este tipo mapea un SQL DECIMAL a un string en PHP.
5. float (número con punto flotante): este tipo mapea un SQL FLOAT a un double en PHP. Solo funciona con configuración de zona que utilice punto decimal como separador.
Fecha y hora
1. date (fecha): este tipo mapea un SQL DATETIME a un objeto DateTime de PHP.
2. time (hora): este tipo mapea un SQL TIME a un objeto DateTime de PHP.
3. datetime (fecha y hora): este tipo mapea un SQL DATETIME/TIMESTAMP a un objeto DateTime de PHP.
4. datetimez (fecha y hora): este tipo mapea un SQL DATETIME/TIMESTAMP a un objeto DateTime de PHP con uso horario.
Otros tipos
1. boolean (booleano): este tipo mapea un SQL boolean a un boolean de PHP.
2. object (objeto): este tipo mapea un SQL CLOB a un objeto de PHP utilizando serialize() y unserialize().
3. array: este tipo mapea un SQL CLOB a un array de PHP utilizando serialize() y unserialize().
4. simple_array: este tipo mapea un SQL CLOB a un array de PHP utilizando implode() y explode(), con “,” (coma) como delimitador. Los valores del array no deben contener “,”.
5. json_array: este tipo mapea un SQL CLOB a un array de PHP utilizando json_encode() y json_decode().
6. guid: este tipo mapea un GUID/UUID a un string de PHP. Varchar por defecto pero si la plataforma lo soporta utiliza un tipo especifico.
7. blob: este tipo mapea un SQL CLOB a un resource stream de PHP.