繁体   English   中英

如何使用 symfony 4 在子实体上应用 SoftDeletable

[英]how to apply SoftDeletable on child entity using symfony 4

我想让用户发布他们的帖子(不是软删除)用户有很多帖子

 return $this->em->getRepository(Users::class)->find($userId);

当我得到结果时,将返回带有deletedAt!=null 的帖子,但是当我只得到帖子列表时,不会返回已删除的帖子。

return $this->em->getRepository(Posts::class)->findAll();

所以当我从用户那里得到它们时,我需要应用这个过滤器子实体

由于您使用的是简单的find()findBy()方法,我认为,最快的解决方案是在您的 getter 中使用Criteria ( \\Doctrine\\Common\\Collections\\Criteria ) 来从用户发布。

我假设你有这样的事情:


/** 
 * @ORM\OneToMany(targetEntity=Posts::class, mappedBy="users", cascade={"persist", "remove"}) 
 * 
 */ 
private $posts;
....

/**
 * @return Posts[]|Collection
 */
public function getPosts(): Collection
{
  return $this->posts;
}

所以你可以更新你的getPosts()方法,如:

/**
 * @param bool $ignoreDeleted
 * 
 * @return Posts[]|Collection
 */
public function getPosts(bool $ignoreDeleted = true)
{
  if($ignoreDeleted)
  {
     $crit = Criteria::create()->andWhere( Criteria::expr()->isNull('deletedAt') );
     // $crit->orderBy(['createdAt' => Criteria::DESC]); // newest first
     return $this->posts->matchin($crit);
  }

  return $this->posts;
}

有了它,你就有了更多的控制权。 如果您想“跳过”这些过滤,只需使用$someUser->getPosts(false);调用该方法$someUser->getPosts(false);

这同样适用于树枝

{% for posts in user.post %}
...
{% endfor %}

会在$user上自动调用getPost()并且如果您出于某种原因需要全部明确{% for allPosts in user.getPosts(fasle) %}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM