php - 在 Doctrine 中,如何为 Entity 实现额外的模型功能

标签 php doctrine-orm doctrine

假设我有一个 Doctrine(版本 2)的实体,如下所示:

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * User
 *
 * @ORM\Table(name="users")
 * @ORM\Entity
 */
class User {
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=50, nullable=false)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="group_id", type="string", length=6, nullable=true)
     */
     private $groupId;

    // Getters and setters...
}

现在,我想管理 UserGroup 的关系,但是有一些条件,比如:

  1. 返回 NULL(或 \AppBundle\Entity\Group 的某种骨架/模板,具有未从数据库加载的固定值)如果 Group users.group_id 的 > 不存在,即使它被设置为一个值(数据库中没有设置键限制来防止这种行为),所以需要某种验证/检查
  2. 延迟加载 Group,当调用 $user->getGroup()

我一直在阅读谷歌,但我对如何正确(按照 Doctrine/Symfony 方式)实现这一目标感到困惑。

我可以将 ManyToOne 添加到实体的类关系中,如下所示:

/**
 * @var \AppBundle\Entity\Group
 *
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Group")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="group_id", referencedColumnName="id")
 * })
 */
private $group;

那么如何防止外键不存在导致的异常呢? IE。当我的数据库中可用时,我想检索用户的组详细信息,但当它不可用时,我不希望 Doctrine 抛出异常导致我的应用程序崩溃。

人们说在 Entity 中使用 Entity Manager 是一个 very bad practice并且我同意。但我对使用 Proxy Objects 感到困惑或 Inheritance Mapping为此目的。

似乎使用 Models 可能是一种方式,但我找不到任何关于如何在 Doctrine2 中正确实现它们的强有力的文档。

如果可以,请帮忙。在 Kohana 中,它是如此简单(但不成熟)。


编辑:

@Massimiliano Fedel建议尝试在 User::getGroup() 方法中捕获异常,最终使不存在的组返回为 NULL

所以我提交了这段代码:

/**
 * Get group
 *
 * @return \AppBundle\Entity\Group
 */
public function getGroup() {
    try {
        $group = $this->group;
    } catch (\Doctrine\ORM\EntityNotFoundException $e) {
        $group = null;
    }
    return $group;
}

不幸的是,似乎无法通过这种方式捕获异常,因为框架以 Doctrine\ORM\EntityNotFoundException 退出:

Entity of type 'AppBundle\Entity\Group' for IDs id(999) was not found

编辑 2:

您可以在下面找到一些 User 流程的基础模式,即为什么我不能确保所有 User 在我的中都有可用的 Groups数据库。

enter image description here

最佳答案

1)您是否尝试过在“组”的getter 方法中捕获异常?这样您就可以捕获异常并在发生异常时返回“null”。

2) 来自 doctrine 2.1 文档:“默认情况下关联被标记为惰性,这意味着关联的整个集合对象在第一次访问时被填充。” http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html

关于php - 在 Doctrine 中,如何为 Entity 实现额外的模型功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35363940/

相关文章:

Symfony 3 一对多 : how to add inverse side to owning side when persisting inverse side

mysql - 我的查询很慢

php - 如何使用 Doctrine 仅保留实体层次结构的第一级?

php - YII:如何在不调用小部件的情况下注册 yiiwheels 小部件 Assets

php - 创建包后的 Symfony3 ClassNotFoundException

php - 如何安全地使用 UniqueEntity(在同时有多个用户的网站上)

sqlite - Symfony2 : Unit testing with sqlite

doctrine - 在 Doctrine 2 中查找或创建(更新插入)功能

PHP重复函数调用,最佳实践?

php - PHP 中抽象类和特征的类型协变