Skip to content

Collection index field ignored when selecting things from a not-initialized extra lazy collection #384

Description

@janklan

BC break: no
Version: 2.1.4


Summary:

When attempting to ->match() a slice of an extra lazy collection using strings as indexes, the produced result is not an associative array with the expected indexes, but a regular array.


Sample code

#[ORM\OneToMany(mappedBy: 'assignedTo', targetEntity: Task::class, fetch: 'EXTRA_LAZY', indexBy: 'id')]
private Collection $assignedTasks;

public function getAssignedTaskOn(\DateTimeImmutable $date): ReadOnlyCollection
{
    $startDate = $date->setTime(0, 0);
    $endDate = $startDate->setTime(23, 59, 59, 999999);

    /** @var ExpressionBuilder $expressionBuilder */
    $expressionBuilder = Criteria::expr();

    $expression = $expressionBuilder->andX(
        $expressionBuilder->gte('startDate', $startDate),
        $expressionBuilder->lte('endDate', $endDate)
    );

    $criteria = new Criteria($expression);
    $criteria->orderBy(['position' => Criteria::ASC]);

//        $this->assignedTasks->toArray();
    $results = $this->assignedTasks->matching($criteria);
    dd(
        $results->toArray(),
        $results->getKeys(),
        array_slice($this->assignedTasks->toArray(),0, 2) // sanity check to see the collection is correctly indexes when not using the expressions to select parts of the collection
    );
}

The $this->assignedTasks->toArray(); causes the collection to initialise. With the line commented, the ->matching() is applied to an un-initialised collection, runs a SQL query and returns the expected result, however indexes are wrong:

1 in Employee.php on line 731:
array:1 [▼
  0 => App\Entity\Task {#1375 ▶}
]
2 in Employee.php on line 731:
array:1 [▼
  0 => 0
]
3 in Employee.php on line 733:
array:2 [▼
  "1edb9734-48cc-6eee-9efa-654d8f81754f" => App\Entity\Task {#1788 ▶}
  "1edb9731-73e7-6dfc-a3f3-a1b2352c64a1" => App\Entity\Task {#1825 ▶}
]

With the collection initialised, the result is 100% correct:

1 in Employee.php on line 731:
array:1 [▼
  "1ee8984d-846e-678c-b32f-0d1cce90af40" => App\Entity\Task {#1375 ▶}
]
2 in Employee.php on line 731:
array:1 [▼
  0 => "1ee8984d-846e-678c-b32f-0d1cce90af40"
]
3 in Employee.php on line 731:
array:2 [▼
  "1edb9734-48cc-6eee-9efa-654d8f81754f" => App\Entity\Task {#1602 ▶}
  "1edb9731-73e7-6dfc-a3f3-a1b2352c64a1" => App\Entity\Task {#1639 ▶}
]

Initialising the entire collection defeats the purpose of EXTRA_LAZY, so I assume this is a bug: I expected the indexes to be present in both test cases.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions