Функция соответствия критериям Doctrine ArrayCollection приводит к свойству Undefined: MyEntity::$1 (Symfony 3.4)

Я определил Entity "TrainingProgressEntry" как @ORM\Entity и свойство "обучения", например:

/**
 * @ORM\ManyToOne(targetEntity="Training", inversedBy="training_progress")
 * @ORM\JoinColumn(name="training_id", referencedColumnName="id")
 */
protected $training;

Соответствие @ORM\Entity «Обучение» определяет свойство «обучение_прогресс», например

/**
 * @ORM\OneToMany(targetEntity="TrainingProgressEntry", mappedBy="training", cascade={"remove"})
 * @ORM\OrderBy({"entry_date" = "ASC"})
 */
protected $training_progress;

и метод получения для него, как это

/**
 * Get trainingProgress
 *
 * @return \Doctrine\Common\Collections\ArrayCollection
 */
public function getTrainingProgress()
{
    return $this->training_progress;
}

Наконец, я определяю метод получения, предназначенный для возврата только записей, которые имеют дату более новую, чем некоторая исходная дата:

/**
 * @return \Doctrine\Common\Collections\ArrayCollection
 */
public function getTrainingProgressSinceStart()
{
    $startTime = $this->getUser()->getStart();
    $criteria = Criteria::create()
        ->andWhere(Criteria::expr()->gt('entry_date', $startTime))
        ->orderBy(['entry_date', 'ASC']);
    return $this->getTrainingProgress()->matching($criteria);
}

При использовании этой последней функции я получаю следующее "ContextErrorException":

Notice: Undefined property: AppBundle\Entity\TrainingProgressEntry::$1

приходящий из

vendor\doctrine\collections\lib\Doctrine\Common\Collections\Expr\ClosureExpressionVisitor.php

при попытке «вернуть $object->$field».

Трассировка показывает, что это вызвано упомянутой выше функцией "getTrainingProgressSinceStart()" в строке

return $this->getTrainingProgress()->matching($criteria);

По какой-то причине функция сопоставления не распознается или что-то в этом роде... Я действительно не знаю, что искать сейчас. Любые подсказки очень приветствуются.


person user3440145    schedule 14.03.2019    source источник


Ответы (1)


Вы, вероятно, уже решили это, но я отвечу на него в любом случае для справки для других людей.

Метод: orderBy критериев принимает массив с ключом, являющимся полем, и порядком сортировки, являющимся значением, поэтому, где у вас есть:

/**
 * @return \Doctrine\Common\Collections\ArrayCollection
 */
public function getTrainingProgressSinceStart()
{
    $startTime = $this->getUser()->getStart();
    $criteria = Criteria::create()
        ->andWhere(Criteria::expr()->gt('entry_date', $startTime))
        ->orderBy(['entry_date', 'ASC']);
    return $this->getTrainingProgress()->matching($criteria);
}

Это действительно должно быть ['entry_date' => 'ASC']:

/**
 * @return \Doctrine\Common\Collections\ArrayCollection
 */
public function getTrainingProgressSinceStart()
{
    $startTime = $this->getUser()->getStart();
    $criteria = Criteria::create()
        ->andWhere(Criteria::expr()->gt('entry_date', $startTime))
        ->orderBy(['entry_date' => 'ASC']);
    return $this->getTrainingProgress()->matching($criteria);
}

Источник: https://github. com/doctrine/collections/blob/c23e14f69b6d2d1d1e389bc8868500efc447af7b/lib/Doctrine/Common/Collections/Criteria.php#L152

person Tio    schedule 26.04.2019
comment
Спасибо чувак. На самом деле я не решал его, а заказал список вручную. Это намного лучше :-) - person user3440145; 03.05.2019