Archivo de la categoría: Symfony

Cheat Sheet Doctrine

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.