如何解决Doctrine 防止数据库中不存在记录的 OneToOne 关联出错 客户端类状态等级:调用代码
问题
我正在尝试使用 Doctrine 在 Laravel 应用程序中创建 OnetoOne 关联。尝试访问关联时,我收到此错误。
Entity of type 'Status' for IDs clientId(1) was not found
版本:
教义:2.7.5
Laravel:7.30.4
代码:
客户端类
<?PHP
namespace App\Client;
use App\Person\Person;
use Doctrine\ORM\Mapping as ORM;
/**
* Class Client
* @package App\Client
*
* @ORM\Entity(repositoryClass="ClientRepository")
* @ORM\Table(name="client")
*/
class Client extends Person
{
/**
* @var Status
*
* @ORM\OnetoOne(targetEntity="Status",mappedBy="client")
* @ORM\JoinColumn(name="id",referencedColumnName="client_id",nullable=true)
*/
protected $status;
/**
* @return Status
*/
public function getStatus()
{
return $this->status;
}
}
状态等级:
<?PHP
namespace App\Client\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Class Status
* @package App\Client\Entity
*
* @ORM\Entity(readOnly=true)
* @ORM\Table(name="status_view")
*/
class Status
{
/**
* @var int
*
* @ORM\Id()
* @ORM\Column(name="client_id",type="integer")
*/
protected $clientId;
/**
* @var \App\Client\Client
*
* @ORM\OnetoOne(targetEntity="App\Client\Client",inversedBy="staus")
* @ORM\JoinColumn(name="client_id",referencedColumnName="id",nullable=true)
*/
protected $client;
/**
* @var string
*
* @ORM\Column(name="status",type="string")
*/
protected $status;
/**
* @return string
*/
public function getStatus()
{
return $this->status;
}
}
调用代码
$client->getStatus()->getStatus()
我尝试过的/看过的答案
- Entity of type 'AppBundle\Entity\User' for IDs id(155) was not found - 我没有使用 Doctrine 过滤器,也没有使用 DQL。
-
https://stackoverflow.com/a/49416542/9530790 - 通过一些调整,通过吞并异常来工作,但是当 docs 说
nullable
应该工作时,感觉更像是一个黑客。 -
https://stackoverflow.com/a/21887344/9530790 - 这表明
nullable
应该可以工作,但没有。 -
https://stackoverflow.com/a/15744449/9530790 - 同样的问题不同的答案。指出 Doctrine 不支持零对一关联,但
nullable
我相信应该是解决这个问题的方法,但对于我的问题,它不起作用。此外,也没有指向说明不支持零到一的文档的链接。 - 我相信添加
fetch="EAGER"
应该可以解决我们应用程序中其他地方的空问题不存在。 - “好吧,为什么您的其他关联没有遇到上述错误”。好问题!在深入了解 Doctrine 代码后,我相信原因是因为这些关联是嵌套的,并且出于某种原因(我不确定为什么),嵌套时
spl_object_hash() expects parameter 1 to be object,null given
函数,在类 {{1} } 没有被调用。
附加说明:
-
这是对象在调用
spl_object_hash
时的样子,在下一次UnitOfWork
调用出错之前。$client->getStatus()
-
您可以看到它是一个
->getStatus()
代理对象,它创建的不是“真实”对象,这就是它出错的原因(未找到 ID clientId(1) 的“状态”类型的实体)不使用DoctrineProxies\__CG__\App\Client\Entity\Status {#2011 +__isInitialized__: false #clientId: 4 #client: null #status: null …2 }
时,因为急切加载了一个真正的对象。见here -
Proxy 对象中下面的这段代码是导致上述错误的原因。这就是为什么我不能在父级('true'
Client
类)中执行fetch="EAGER"
的原因,因为它在调用父级之前出错。try catch
问题:
为什么 Client
没有按预期工作,我应该/可以做些什么来使它工作?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。