gpt4 book ai didi

php - 有没有更好的方法来处理 Doctrine 代理对象

转载 作者:可可西里 更新时间:2023-11-01 06:49:52 26 4
gpt4 key购买 nike

我有两个以一对一关系链接的类。

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 block 并更改查询以从数据库中检索对象。现在,我强制查询在检索 Client 对象的同时检索 ClientInfo 对象。

这样,我可以信任我的测试,如果我忘记同时查询两个对象,我会有一个异常提醒我。

最佳答案

看,我已经为你开设了类(class)。

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*-(父可选),请看图。

ER diagram

建议:使用ORM设计器工具设计和提取实体类。

关于php - 有没有更好的方法来处理 Doctrine 代理对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com