如何检查Doctrine2存储库中是否找到对象?

8

我正在按照以下方式通过其主键查找实体:

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

如何正确地检查$ent是否为真正的代表对象?我所说的真正的是指$ent目前存在于数据库中,并且由于我计划将相同的结果用于INSERTUPDATE,因此已被返回。在伪代码中,我的想法是:

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

我在考虑使用is_object()或者instanceof,但是我不确定它们是否能够完成工作,或者即使在数据库中不存在Representative,$ent是否仍然是一个对象。对此有什么建议吗?我该如何实现?


我一定漏掉了什么,因为在我看来,要么您的对象存在于数据库中,find($id)将找到它,并且它将是一个代表对象,要么如果未找到,则返回null。我认为没有必要检查对象的类型... - Guillaume Fache
@GuillaumeFache,你的意思是条件语句中正确的写法应该是像 !$ent$ent !== null 这样简单明了的形式吗?是这样吗? - ReynierPM
1
Doctrine的默认查询应该在数据库中未找到对象时返回Null。如果您的问题是数据库中的对象是否有效,您应该查看验证 https://symfony.com/doc/current/book/validation.html - Squeegy
@ReynierPM 我认为这已经足够了(就像下面答案中所说的)。 - Guillaume Fache
2个回答

15

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

if ($entity) {
}

if (null !== $entity) {
}

if ($entity instanceof Representative) {
}

选择最适合你编码标准的,并保持一致使用。

如果不需要在未找到对象时创建一个新对象,最好抛出异常并适当处理它。


事实上,我需要创建一个新对象,请查看与此相关的另一篇文章,感谢您的回答。 - ReynierPM

2
这个怎么样?
$product = $this->getDoctrine()
        ->getRepository('AppBundle:Product')
        ->find($id);

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

Source: click me


在这种情况下,我不认为抛出异常是好的。当要求查找/获取某些内容时,已知该内容可能不存在。在我看来,可以返回一个布尔值并由调用者检查布尔值,或者返回实体|null并由调用者检查对象|null。哪个取决于您是否实际上需要存在的实体,如果不需要,则返回布尔值只需检查true/false。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接