比方說,我有一個原則的(第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...
}
現在,我想管理User
的關係,以Group
,但一些條件,如:
- 返回
NULL
(或某種\AppBundle\Entity\Group
具有固定值的骨架/模板不是從數據庫加載)如果不存在,即使它被設置爲一個值(在數據庫設置爲阻止這種行爲沒有鍵限制),所以某種驗證/檢查的要求 - 延遲加載
Group
,呼籲$user->getGroup()
我正在閱讀谷歌,我很困惑如何實現正確(符合Doctrine/Symfony的方式)。
我可以一個多對一添加到實體類的關係是這樣的:
/**
* @var \AppBundle\Entity\Group
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Group")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="group_id", referencedColumnName="id")
* })
*/
private $group;
但後來如何防止因不存在的,外鍵異常?即我想檢索用戶的組詳細信息,當它在我的數據庫中可用時,但當它不是我不想Doctrine拋出一個異常崩潰我的應用程序。
人們說,使用實體管理器從Entity
是very bad practice,我同意。但我爲此迷惑了Proxy Objects或。
似乎可以這樣使用Models
,但我找不到任何有關如何在Doctrine2中正確實施它們的強大文檔。
如果可以,請幫助。在Kohana它是如此簡單(但這種方式不成熟)。
編輯:
@Massimiliano Fedel建議嘗試在User::getGroup()
方法捕獲異常,最終使不存在的組返回作爲NULL
。
所以我COMMITED驗證碼:
/**
* 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
EDIT 2 :
下面你可以找到d一些User
流程的基礎架構,即爲什麼我不能確保在我的數據庫中所有Users
都有可用的Groups
。 http://oi64.tinypic.com/1sfno5.jpg
你能解釋一下更多的實際用例嗎?假設我們有一個不在數據庫中的用戶。您希望在請求之間發生什麼? – Cerad
@Cerad你是什麼意思「請求之間」? – roomcays
所以你讓一個用戶擁有一個不在數據庫中的組,顯然你不想真的堅持這個組。 (爲什麼我不知道)。所以現在用戶導航到其他頁面。你是否期望$ user對象仍然具有相同的組?如果是這樣,該組將存儲在哪裏?如果我們知道你爲什麼想要這種功能,那麼也許我們可以提供更多的建議。 – Cerad