Doctrine ArrayCollection匹配条件函数导致Undefined属性:MyEntity :: $ 1(Symfony 3.4)

问题描述 投票:0回答:1

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

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

匹配的@ORM \ Entity“Training”定义了一个属性“training_progress”

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

和像这样的getter方法

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

出于某种原因,匹配功能似乎没有得到认可......我真的不知道现在要找什么。任何提示都非常受欢迎。

doctrine criteria symfony-3.4 arraycollection doctrine-collection
1个回答
1
投票

你可能已经解决了这个问题,但我会以其他人的方式回答它。

方法:orderBy of criteria接受一个带Key的数组,即字段,排序顺序是值,所以你有:

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

© www.soinside.com 2019 - 2024. All rights reserved.