OneToMany in Doctrine ORM Mapping with Dropzone images
OneToMany in Doctrine ORM Mapping with Dropzone images
我在 Symfony 中有一个表单,其中有一个使用 dropzone.js 上传图像的拖放区,当上传图像时,图像路径以及表单所属实体的当前实例的 ID分别作为 imageName
和 listing_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();
});
}
});
我在 Symfony 中有一个表单,其中有一个使用 dropzone.js 上传图像的拖放区,当上传图像时,图像路径以及表单所属实体的当前实例的 ID分别作为 imageName
和 listing_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();
});
}
});