@ORM \ OneToMany正在检索虚拟删除的条目

时间:2018-01-11 09:01:27

标签: php laravel doctrine-orm annotations

我在Doctrine2 @ORM \ OneToMany中有一个关系,假设我有表学校和学生,在实体学校我有@ORM \ OneToMany专栏学生 , 我还有一个虚拟删除 deleted_at ,因此每个 deleted_at不同于null 的学生都是被删除的学生 @ORM \ OneToMany $ students 列中不显示。如何制作过滤器

/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 *
 * @ORM\OneToMany(targetEntity="App\Oceano\Entities\Student",
 *      mappedBy="cartCore",
 *      cascade={"all"}
 * )
 */
private $students;

所以,当我打电话给学校学生时,它也会检索已删除的学生。

$schoolObj->getStudents();

任何使用注释或一些干净更改的解决方案?

2 个答案:

答案 0 :(得分:0)

你几乎描述了Laravel的soft deleting功能。因此,如果您使用它,您不需要做任何事情,软删除的学生将不会出现。您只需要将Illuminate\Database\Eloquent\SoftDeletes特征添加到Student模型。

如果您正在使用某些自己的功能,请在Student模型中创建一个本地范围:

public function scopeNotDeleted($query)
{
    return $query->whereNull('deleted_at');
}

并使用它:

Student::notDeleted()->get();

或者:

$school->students()->notDeleted()->get();

答案 1 :(得分:0)

您可以将实体中的Criteria过滤器类用于未删除的学生集合

protected getStudents() { 
    $criteria = \Doctrine\Common\Collections\Criteria::create()
                ->where(\Doctrine\Common\Collections\Criteria::expr()->eq('deleted_at', null));
 return $this->students->matching($criteria);
}

要删除已删除的学生,您可以将其写为

protected getDeletedStudents() { 
    $criteria = \Doctrine\Common\Collections\Criteria::create()
                ->where(\Doctrine\Common\Collections\Criteria::expr()->neq('deleted_at', null));
 return $this->students->matching($criteria);
}

How filter data inside entity object in Symfony 2 and Doctrine