我有两个与一对一关系相关联的类。
class Client {
...
/**
* @ORM\OneToOne(targetEntity="ClientInfo")
* @ORM\JoinColumn(name="id", referencedColumnName="client_id")
*/
private $info;
...
public function doSomething() {
if (!$this->getInfo() instanceof ClientInfo) {
return false;
}
return $this->getInfo()->doSomething();
}
...
}
class ClientInfo {
...
/**
* @ORM\Id
* @ORM\OneToOne(targetEntity="Client")
* @ORM\JoinColumn(name="client_id", referencedColumnName="id")
*/
private $client;
...
public function doSomething() {
return 'something';
}
...
}
这些类使用Doctrine加载数据库内容。当数据库中有数据时,它工作正常。但是如果没有ClientInfo数据,我就会引发 \ Doctrine \ ORM \ EntityNotFoundException 。
所以我改变 doSomething()方法来考虑这一点。
public function doSomething() {
if (!$this->getInfo() instanceof ClientInfo) {
return false;
}
try {
return $this->getInfo()->doSomething();
} catch (\Doctrine\ORM\EntityNotFoundException $e) {
return false;
}
}
但是我感觉不对,因为它与 Doctrine 相关联。我正在尝试修改我的单元测试以添加代理对象的模拟,但它也感觉不对。
有更好的方法吗?
编辑1
我遵循Nico Kaag的建议,但它没有改变任何东西。
我的Client类中的构造函数如下所示:
public function __construct() {
$this->info = new ClientInfo();
}
如果我在使用Doctrine检索我的对象后执行 $ this-> info 的var_dump,这就是我得到的。
object(Proxies\__CG__\MyBundle\Entity\ClientInfo)[444]
public '__initializer__' =>
object(Closure)[461]
public '__cloner__' =>
object(Closure)[462]
public '__isInitialized__' => boolean false
private 'client' (MyBundle\Entity\ClientInfo) => string '21055' (length=5)
...
编辑2
我终于改变了我的所作所为。我删除了try..catch块并更改了查询以从数据库中检索对象。现在,我强制查询在 Client 对象的同时检索 ClientInfo 对象。
这样,我可以相信我的测试,如果我忘记同时查询这两个对象,我会有一个例外来提醒我。
答案 0 :(得分:2)
看我已经为你上课了。
use Doctrine\ORM\Mapping AS ORM;
/**
* @ORM\Entity
*/
class client
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="Entities\client_info", inversedBy="client")
* @ORM\JoinColumn(name="client_info_id", referencedColumnName="id", unique=true)
*/
private $clientInfo;
}
use Doctrine\ORM\Mapping AS ORM;
/**
* @ORM\Entity
*/
class client_info
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="Entities\client", mappedBy="clientInfo")
*/
private $client;
}
试试这个,你不会遇到这样的问题。
此外,我使用双向关系与基数一对一,父连接0:1 * - (父可选),请参阅图表。
建议:使用ORM设计器工具设计和提取实体类。