【问题标题】:How do I check if object was found in a Doctrine2 repository?如何检查是否在 Doctrine2 存储库中找到对象?
【发布时间】:2015-06-29 12:33:00
【问题描述】:

我通过 PK 找到一个实体,如下所示:

$ent = $em->getRepository('AppBundle:Representative')->find($id)

检查$ent 是否是真实的代表对象的正确方法是什么?我对 real 的意思是 $ent 当前存在于 DB 中,并且由于我计划对 INSERTUPDATE 使用相同的结果而被返回。在伪代码中,我的想法是:

if (ent is Representative)
{
    // Update its values
} else {
    // Create a new Representative
}

我正在考虑使用is_object() 甚至instanceof,但我不确定他们是否会完成这项工作,或者即使 DB 上不存在代表,$ent 是否会成为一个对象。对此有何建议?我怎样才能做到这一点?

【问题讨论】:

  • 我必须错过一些东西,因为我看到它的方式是,您的对象存在于 DB 中并且 find($id) 会找到它,它将是一个代表对象,或者如果没有找到它返回 null .我认为没有必要检查对象的类型...
  • @GuillaumeFache 所以你是说正确的方法应该只是像!$ent$ent !== null 这样的条件?那个?
  • 如果在数据库中找不到对象,Doctrine 的默认查询应该返回 Null。如果您的问题是数据库中的对象是否有效,您应该查看验证symfony.com/doc/current/book/validation.html
  • @ReynierPM 我认为这就足够了(就像下面答案中所说的那样)

标签: php symfony doctrine-orm symfony-2.6 symfony-2.7


【解决方案1】:

EntityRepository::find() 方法(您使用)返回object,如果在数据库中找不到对象,则返回null。以下所有条件均有效:

if ($entity) {
}

if (null !== $entity) {
}

if ($entity instanceof Representative) {
}

选择最适合您的编码标准的一种,并始终如一地使用它。

如果没有找到就不需要创建新对象,最好抛出异常并适当处理。

【讨论】:

  • 事实上我需要创建一个新对象,如果你能看一下与这个有关系的this other post,谢谢你的回答
【解决方案2】:

这个怎么样:

$product = $this->getDoctrine()
        ->getRepository('AppBundle:Product')
        ->find($id);

    if (!$product) {
        throw $this->createNotFoundException(
            'No product found for id '.$id
        );

来源:click me

【讨论】:

  • 我不会说在这种情况下抛出异常是好的。当要求查找/获取某物时,已知该某物可能不存在。 IMO 返回,例如要么是 bool,调用者检查 bool,要么返回 entity|null,调用者检查 object|null。哪一个取决于您是否真的需要实体(如果存在),如果不存在则返回 bool 只需检查真/假。
猜你喜欢
  • 2021-06-01
  • 2011-09-08
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
相关资源
最近更新 更多