在Doctrine中,如何为Entity实现其他模型功能

roo*_*ays 7 php doctrine doctrine-orm

假设我有一个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...
}
Run Code Online (Sandbox Code Playgroud)

现在,我想管理User的关系Group,有一定的条件,如:

  1. 返回NULL(或某种骨架/模板的\AppBundle\Entity\Group不是从数据库加载与固定值),如果Groupusers.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;
Run Code Online (Sandbox Code Playgroud)

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

人们说从内部使用实体经理Entity是一种非常糟糕的做法,我同意.但是我为使用代理对象继承映射而感到困惑.

似乎使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

Entity of type 'AppBundle\Entity\Group' for IDs id(999) was not found
Run Code Online (Sandbox Code Playgroud)

编辑2:

下面你可以找到一些User流程的基础模式,即为什么我不能确保所有数据库Users都可用Groups. http://oi64.tinypic.com/1sfno5.jpg

小智 1

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

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