Skip to content

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

@janklan

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
    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