【问题标题】:Symfony3 Doctrine2 Column cannot be nullSymfony3 Doctrine2 列不能为空
【发布时间】:2017-01-21 17:03:09
【问题描述】:

[问题已解决]

大家好,我在一个 symfony 项目上需要你们的帮助。

我有两个实体,“文章”和“图像”,文章可以有多个图像,所以我在文章侧建立了 OneToMany 关系,在图像侧建立了 ManyToOne 关系。 Doctrine 在图像表上为我生成了一个“article_id”列。 我制作了一个表单来创建包含一个或多个图像的文章......但是当我执行它时,我抛出了一个错误:

执行'INSERT INTO image (url, alt, article_id) VALUES (?,?,?)' 时发生异常,参数为 ["jpeg", "untitled.jpg", null]: SQLSTATE [23000]: Integrity违反约束:1048 列“article_id”不能为空。

当我查看探查器日志调试时,我可以看到我有一个“INSERT INTO article[...]”(所以文章是使用 ID 创建的?),就在这之后我有著名的“INSERT INTO image[...]" 发生错误的地方。

感谢您的帮助。

EDIT 以粗体显示您会发现我添加的用于解决此问题的行。

我在 ArticleType 表单中添加了图片收集选项:

'by_reference' => 错误

然后我将 addImage 方法添加到 Article 实体中:

$image->setArticle($this);

$this->images->add($image);

【问题讨论】:

  • 啊,是的。霰弹枪接近。您从没有代码到发布所有内容。然而我昨天发布的解决方案没有显示出来。很伤心。这是一个想法。仅使用文章/图像具有的关系使自己成为两个新实体。摆脱其他只会引起混乱的废话。让这两个新实体正确发布,瞧,您可能会明白发生了什么。
  • 更好的是,按照文档中的示例进行操作:symfony.com/doc/current/form/form_collections.html
  • 谢谢@Cerad。文档引导我解决问题。我添加了您在第一个答案中告诉我的行:$image->setArticle($this),并且我还以相同的方法添加了 $this->images->add($image)。我还在我的表单图像集合选项中添加了“by_reference”=> false。以史为鉴 !实时调频!

标签: sql symfony doctrine


【解决方案1】:

这是一个非常常见的问题,但很难搜索。事实上,前十个左右的搜索结果都有错误的答案。

无论如何,您都需要确保该图片与文章相关联。

class Article
    public function addImage($image) {
        $this->images[] = $image;
        $image->setArticle($this); // ADD THIS

【讨论】:

  • 谢谢塞拉德。但是我确实添加了 $image->setArticle($this) 行,但我得到了完全相同的错误...
  • 我必须在 Image 实体中做同样的事情吗?
  • 想一想如果你添加了这条线或者尝试一下会发生什么。请确保您清空了数据库,因为您现有的图像现在无效。验证是否正在调用 Article::addImage。你没有提供关于你的实体或形式的任何细节,所以我主要依靠我的精神力量来调试这个。
  • 到目前为止,你在这些能力方面做得很好啊啊。如何检查是否正在调用 Article::addImage ?另一个人告诉我,最好在我的控制器中执行 $image->setArticle($article) ......如果你愿意,我会粘贴我的代码。再次感谢。
  • 一个简单的 die 语句就可以解决问题。尽量避免向控制器添加代码,因为这样每次添加图像时都需要运行代码。这将是一种痛苦。另一方面,您可以将其添加为调试工具,以验证交叉链接是否存在问题。然后在一切正常后将其删除。
【解决方案2】:

我认为@Cerad 的回答是非常错误的,虽然我不能责怪他,因为 OP 没有发布足够的代码,不要害羞,我们是来帮忙的。如果您刚刚开始(我怀疑您是),这也有助于简要提及,因为这将帮助我们判断这是一个新手问题还是更深层次的问题。

因为我假设这是一个新手问题,所以这里是新手解决方案。

通过他们绘制的方式(我相信这是正确的),您基本上是在告诉 Doctrine 告诉您的 RDBMS(MySql/MariaDB/PostgreSQL)一篇文章可以有很多图片,但一张图片必须属于一篇文章。

这意味着如果您尝试保存图片而不指定所属文章,则会引发错误。

这就是我认为你正在做的事情

(url, alt, article_id) VALUES (?,?,?) 'with params ["jpeg", "untitled.jpg", null]

值“null”是问题所在,因为您没有指定拥有的文章。

你有两个选择

1.) 保存图片时,如果您手头有文章对象,只需这样做

$image->setArticle($article);

2.) 保存图片时,如果您手头有 article_id 就可以了

$image->setArticle($em->getReference('AppBundle\Entity\Articles', $article_id));

直接保存图片时,必须遵循上述其中一项操作。

我的一般经验是,Doctrine 在从命令行生成实体方面做得非常好,除非添加一些高级功能,例如 second_level_cache 或 MySQL 点类型,否则您实际上不需要进行太多更改。

干杯。

【讨论】:

  • 虽然您是正确的,基本问题是图像没有链接到文章,但我怀疑一旦您使用了 Doctrine 2 ORM 一段时间,您就会明白您提出的解决方法并不是那么方便,也没有必要。特别是在使用 Symfony 表单集合组件时。
  • 我想我们会让 OP 决定他什么时候回复我们。当我说你的答案是错误的时,我的意思是在问题的背景下,如果我的假设是正确的,我承认这不是你的错。如果他们不是,我很乐意承认而不是捍卫它。如果问题是(可能)他如何将记录保存到数据库,那么要求 OP 编辑​​实体是错误的。当您将骰子添加到混合物中时,情况会更糟。
  • 只是为了让你不认为我不公平,我还认为告诉 OP 清空 DB 是一个糟糕的主意,因为如果我错了,请纠正我,“执行时发生异常" 表示除非 OP 在多次刷新中保存,否则没有任何内容保存到 DB 中,那么为什么要清除 DB?
  • 嘿!谢谢唐。好吧,你是对的,我是新手......那么我到底应该把这两种解决方案中的一种放在哪里呢?因为我试图在控制器中添加 $image->setArticle($article) (我还添加了 $image = new Image()),但我得到了同样的错误......
【解决方案3】:

问题是,当您提交表单时,第一张图片已附加到文章中,而其他图片则没有,因此您会收到 SQL 错误。 您必须为每张图片执行“foreach 循环”,并将文章附加到每张图片上。 看这里的addAction函数 https://github.com/ismail1432/TheGoodLoc/blob/master/Symfony/src/VTC/AnnonceBundle/Controller/AdvertController.php

【讨论】:

  • 表单集合将为每个新图像调用 addImage。发帖人昨天证实了这一点。绝对不需要任何额外的循环。
猜你喜欢
  • 2017-08-14
  • 2018-05-01
  • 2012-08-31
  • 2013-04-12
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多