原则ArrayCollection匹配条件函数会产生Undefined属性:MyEntity :: $ 1(Symfony 3.4)

时间:2019-03-14 00:06:41

标签: doctrine criteria symfony-3.4 arraycollection doctrine-collection

我将实体“ TrainingProgressEntry”定义为@ORM \ Entity,并定义了“ training”属性,如下所示:

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

匹配的@ORM \ Entity“培训”定义了属性“ training_progress”,例如

/**
 * @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;
}

最后,我定义了一个getter方法,该方法旨在仅返回日期比某个参考日期新的条目:

/**
 * @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);

出于某种原因,似乎无法识别匹配功能或其他原因... 我真的不知道现在要寻找什么。 任何提示都非常欢迎。

1 个答案:

答案 0 :(得分: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