FOSCommentBundle保存注释,但每次刷新页面时,它都会在Thread表中创建一个新条目,而不是保存在该页面的记录上。例如,如果页面slug是http://johnson.localhost/app_dev.php/page/whats-up-baby,则每次重新打印页面时都会创建一条新记录,因此我的表格如下所示:
注意所有那些slu are都是一样的!以下是我希望它的工作方式:
但是一旦刷新,它就会开始创建新的条目,如:
我正在显示这样的表格:
{% include 'FOSCommentBundle:Thread:async.html.twig' with {'id': post.id} %}
我正在使用YAML,所以这里是我的线程和Commment YAML FIles。
Johnson\BlogBundle\Entity\Thread:
type: entity
table: null
id:
id:
type: integer
id: true
generator:
strategy: AUTO
lifecycleCallbacks: { }
Johnson\BlogBundle\Entity\Comment:
type: entity
manyToOne:
thread:
targetEntity: Johnson\BlogBundle\Entity\Thread
inversedBy: comments
table: null
id:
id:
type: integer
id: true
generator:
strategy: AUTO
lifecycleCallbacks: { }
我不知道如何表达:
* @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
在YAML。这可能是问题吗?
答案 0 :(得分:0)
您遇到的问题与 ChangeTrackingPolicy 选项无关。无论如何,如果你想在YAML中设置值,你可以这样做:
changeTrackingPolicy:DEFERRED_EXPLICIT
现在关于你的问题。 它接收你提供的 post.id 的价值正在改变每个请求。您是否可以尝试将 {{post.id}} 放入模板中以查看其值。它应该与帖子实体的唯一标识符相同(假设您有一个帖子实体)。
<强>更新强>
Okk,正如你所提到的,你的帖子ID 没有问题,那么简而言之,解决方案就是为你的线程实体更新YAML中的生成器策略,如:
Docudex\Bundle\CommentBundle\Entity\Thread:
type: entity
table: null
id:
id:
type: integer
id: true
generator:
strategy: NONE
lifecycleCallbacks: { }
changeTrackingPolicy : DEFERRED_EXPLICIT
确保先清除所有错误的线程条目,然后清除缓存。希望能解决你的问题。
<强>解释强>:
当您将生成器策略设置为 AUTO 时,Doctrine会为新线程设置新的自动生成ID。虽然它不是假设发生,但它的发生! 我发现如果您在 FOSCommentBundle 的child bundle内创建实体,则自动策略没有任何问题。这就是为什么,当我第一次尝试时,它没有给我任何问题。然后,我可以通过将实体移出子包来重现我的环境中的问题。
<强>建议强>:
虽然对于简单的设置,您可以采用您的方法,但是当您使用这样的包时创建子包是个好主意。这将为您提供更多定制能力。