我有 OneToMany 相关实体图库和媒体存储在 gallerys_media 中 我在 GalleryMedia Entity 中有多对一相关和多对一相关
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="\Entity\GalleryMedia", mappedBy="gallery", cascade={"persist", "remove"})
*/
protected $galleriesMedia;
以及在 GalleryMedia 实体中
/**
* @ORM\ManyToOne(targetEntity="\Entity\Gallery", inversedBy="galleriesMedia")
* @ORM\JoinColumn(name="gallery_id", referencedColumnName="id", nullable=false)
*/
protected $gllary;
/**
* @ORM\ManyToOne(targetEntity="\Entity\Media", inversedBy="galleries")
* @ORM\JoinColumn(name="media_id", referencedColumnName="id", nullable=false)
*/
protected $media;
我如何在表单中做到这一点
最佳答案
- 一对多:
sonata_type_collection
就您而言:
class GalleryAdmin
{
// ...
$formMapper
->add('galleriesMedia', 'sonata_type_collection', [
'required' => false,
'label' => 'my_galleries_media_label',
'btn_add' => 'my_add_button_name',
'type_options' => [
'delete' => false,
],
], [
'edit' => 'inline', // or standard
'inline' => 'table', // or standard
'sortable' => 'id', // by any field in your entity
'limit' => 5, // you can remove this - this is a limit of items
'allow_delete' => false,
'placeholder' => $this->trans('admin.placeholder.no_media'),
])
;
class GalleriesMediaAdmin
{
// ...
$formMapper
->add('media', 'sonata_type_model_list', [
'required' => true,
'btn_add' => false,
'btn_list' => 'name_of_list_button'
'btn_delete' => false,
'btn_catalogue' => 'admin',
'label' => 'name_of_your_label',
], [
'placeholder' => 'choose media',
'edit' => 'inline',
'inline' => 'table',
'sortable' => 'id',
])
- 多对多:
sonata_type_model
你可以用原则进行多对多:
class Gallery
{
// ...
/**
* Unidirectional Many-To-Many ()
*
* Every Gallery can have a lot of medias
*
* @ORM\ManyToMany(targetEntity="\Entity\Media")
* @ORM\JoinTable(
* name="gallery_media_table",
* joinColumns={@ORM\JoinColumn(name="gallery_id", referencedColumnName="id", onDelete="CASCADE")},
* inverseJoinColumns={@ORM\JoinColumn(name="media_id", referencedColumnName="id", onDelete="CASCADE")}
* )
*
* @Assert\Valid()
*/
protected $medias;
然后在您的 GalleryAdmin 中您应该使用 sonata_type_model:
$formMapper
->add('medias', 'sonata_type_model', [
'multiple' => true,
'expanded' => true, // or false
'class' => Media::class,
'property' => 'name', // or any field in your media entity
'label' => 'your_label',
'btn_add' => true,
'btn_list' => false,
'btn_delete' => true,
'btn_catalogue' => 'admin', // or your own translate catalogue in my case file admin.en.yml
])
关于symfony - sonata admin 一对多和多对多形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47147782/