> For the complete documentation index, see [llms.txt](https://akyos.gitbook.io/book/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://akyos.gitbook.io/book/symfony/un-code-propre/repositories.md).

# Repositories

Lorsque vous souhaitez récupérer des informations auprès de la BDD, référez-vous à ces fichiers.

{% hint style="danger" %}
Aucune query n'est toléré en dehors de ces fichiers.
{% endhint %}

### Découpage

Pensez que vous pouvez retourner un query builder et non un résultat directement. Cela permettra d'ajuster vos query au fur et à mesure, et d'imbriquer vos requêtes complexes.

```php
public function intersectDates(QueryBuilder $qb, $alias): Orx
{
    return $qb->expr()->orX(
        $qb->expr()->andX(
            $qb->expr()->gt($alias.'.startTime', ':startTime'),
            $qb->expr()->lt($alias.'.endTime', ':startTime'),
        ),
        $qb->expr()->andX(
            $qb->expr()->lt($alias.'.startTime', ':endTime'),
            $qb->expr()->gt($alias.'.endTime', ':endTime'),
        ),
        $qb->expr()->andX(
            $qb->expr()->lt($alias.'.startTime', ':startTime'),
            $qb->expr()->gt($alias.'.endTime', ':startTime'),
        ),
        $qb->expr()->andX(
            $qb->expr()->eq($alias.'.startTime', ':startTime'),
            $qb->expr()->eq($alias.'.endTime', ':endTime'),
        ),
        $qb->expr()->andX(
            $qb->expr()->gte($alias.'.startTime', ':startTime'),
            $qb->expr()->lte($alias.'.endTime', ':endTime'),
        ),
        $qb->expr()->andX(
            $qb->expr()->lte($alias.'.startTime', ':startTime'),
            $qb->expr()->gte($alias.'.endTime', ':endTime'),
        ),
    );
}
```

```php
public function states(QueryBuilder $qb, $alias, array $states = [
    Task::STATE_INIT,
    Task::STATE_TREATMENT,
    Task::STATE_APPOINTMENT,
    Task::STATE_M30,
    Task::STATE_ONGOING,
    Task::STATE_FINISHED,
    Task::STATE_COMPLETED,
]): QueryBuilder
{
    return $qb
        ->andWhere($qb->expr()->in($alias.'.state', ':states'))
        ->setParameter('states', $states)
        ;
}
```

```php
public function findTasks(CarParticipation $carParticipation, \DateTime $startTime, \DateTime $endTime): QueryBuilder
{
    $qb = $this->createQueryBuilder('t');

    $this->states($qb, 't');

    $qb
        ->andWhere(
            $qb->expr()->andX(
                $qb->expr()->eq('t.reservationFor', ':carParticipation'),
                $this->intersectDates($qb, 't'),
            ),
        )
        ->setParameter('carParticipation', $carParticipation)
        ->setParameter('startTime', $startTime)
        ->setParameter('endTime', $endTime)
    ;

    return $qb;
}
```
