我使用存在的数据创建一个新的应用程序。
我使用sonatadminbundle列出对象的数据网格" Formule" 在我的对象" Formule"我与对象"联系"有关系。 在我的列表中需要显示这种关系。但我知道过去有一些联系人被删除了。我想在我的行datagrid的模板中做到这一点:
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
{% block field%}
{% if object.getContact.name is defined %}
{{ object.getContact.name }} //EntityWasNotFound
{% else %}
This contact was deleted in the past
{% endif %}
{% endblock %}
因此,此错误返回行中的EntityWasNotFound异常或删除了联系人。我不知道是否有联系人。我使用"不是空","定义","空" ......没什么好的:(
由于
答案 0 :(得分:8)
当您使用softdeleteable或者您的遗留数据库存在一些完整性问题(没有相关行的ID)时,这是一个常见问题。在这种情况下,实体的代理被创建得很好(带有它的id),但是当你得到别的东西时,代理试图获取真实实体并且无法抛出这个异常
你可以以多种方式进行,但是在奏鸣曲管理员中有点困难所以我的建议是创建一个方法来处理异常然后有更多的信息
use Doctrine\ORM\EntityNotFoundException;
....
public function hasContact()
{
try {
$ret = parent::getParent();
if (isset($ret) && $ret->getName()) {
return true;
}
return false;
} catch (EntityNotFoundException $e) {
return false;
}
}
当然你可以将它移出实体并为它创建一个枝条扩展( NOT TESTED )
public function isEntityDefined($entity = null)
{
if($entity instanceof \Doctrine\ORM\Proxy\Proxy){
try {
$entity->__load();
} catch (EntityNotFoundException $e) {
$entity = null;
}
}
return isset($entity);
}
另一种方法是使用控制器中的以下代码禁用softdeleteable
$this->get('doctrine.orm.entity_manager')->getFilters()->disable('softdeleteable');
当然这样yuo需要查看deletedAt属性来检查实体是否被删除
答案 1 :(得分:0)
您应首先清除数据库并删除受影响的表中的所有孤立行。 它看起来像是一个带有记录的连接表,指向不存在的外来记录。我不认为你可以在代码中检测到这一点,因为根据Doctrine有记录,但事实上你的数据库不会返回任何内容。
答案 2 :(得分:0)
检查您的数据库引擎是否 InnoDB 。
我今天遇到了这个问题,我们的一个客户托管只有 MyISAM 引擎,这意味着ON DELETE CASCADE
的外键无效。当客户端删除相关实体(在我们的案例中为类别)时,我们在访问关系时开始收到错误消息未找到实体。。
如果是这种情况,请将数据库引擎更改为 InnoDB 并使用控制台更新shema。
另外,请确保设置与 NULL 无关的条目。