OneToMany in Doctrine ORM Mapping with Dropzone images

OneToMany in Doctrine ORM Mapping with Dropzone images

我在 Symfony 中有一个表单,其中有一个使用 dropzone.js 上传图像的拖放区,当上传图像时,图像路径以及表单所属实体的当前实例的 ID分别作为 imageNamelisting_id 上传到 Image table。 listing_id 是用户正在填写的当前列表的 id。由于每个列表有多个图像,我想知道是否可以在 listing 对象和图像之间保持 OneToMany 关系。

当用户点击 "Add Listing" 时,listing 对象被创建为空值作为草稿(除了 id),然后图像被放入,因此它们被添加到之后的数据库。

Listing.php

/**
 * @ORM\OneToMany(targetEntity="Image", mappedBy="listing", cascade={"persist"}, orphanRemoval=true)
 */
private $images;

Image.php

/**
 * @ORM\ManyToOne(targetEntity="Listing", inversedBy="images")
 * @ORM\JoinColumn(name="listing_id", referencedColumnName="id", onDelete="CASCADE")
 */
private $listing;

这会导致在放入图像时出现错误,但如果我将 $listing 更改为

 /**
 * @ORM\Column(type="integer", nullable=true, name="listing_id")
 */
protected $listing;

它有效,但我的目的是稍后使用 listing 对象检索图像,因此这不是预期的结果。我的问题是,即使图像对象是在与列表不同的时间(稍后)创建的,我是否仍能保持这两个值之间的这种耦合。事实上,当我使用这些注释将某些东西放在拖放区时,我会收到错误消息。

由于图像行是实时插入到 table 中的,而不是在表单提交时,使用这种耦合时可能会导致错误,但我不确定。

你走在正确的道路上。我正在使用 oneup/uploader-bundle 来完成这项任务。

需要正确的@ManyToOne。 @Column 不会工作。

但在我的用例中,它是一个带有附加数据的内联图像。

我不得不停用 dropzone 自动加载并手动手工制作 dropzone 调用和设置以包括其他表单字段。

还有一个选项可以在删除文件后不立即开始手动上传。 这样一来,就可以通过一个 post 请求创建整个事物,而无需事先保留列表以拥有 ID...

希望对您有所帮助。我可以分享我的代码,但现在不能在机器上。

编辑:这是我的代码:

var myDropzone = new Dropzone("#documentTypeUploadDropzone", {

            url : actionUrl,
            dictDefaultMessage: 'Bitte das neue Dokument hier ablegen!',

            // The configuration we've talked about above
            autoProcessQueue: false,

            maxFiles: 1,
            init: function () {
                this.on('success', function(e, serverResponse) {

                    myDropzone.removeAllFiles();

                });

                this.on('sending', function(file, xhr, formData) {
                    // Add additional data form original <form> which was already checked by html5 client side verification
                    formData.append('productId', 1);
                    formData.append('documentType[name]', value1;
                    formData.append('documentType[foreignUrl]',   $(#formInput).val());

                });

                var myDropzone = this;

                $('#documentTypeUploadForm').on('submit', function(e) {
                    // Make sure that the form isn't actually being sent.
                    e.preventDefault();
                    e.stopPropagation();


                    var files = myDropzone.getQueuedFiles();
                    if (!files.length) {
                        $.growl.error({ title:"Fehler", message: 'Bitte zuerst ein Dokument zum Hochladen auswählen.'});
                        return
                    }


                    myDropzone.processQueue();
                });


            }
        });