我在Sonata管理表单上有问题...

我想在有位置的专辑中插入音乐...

我的问题是当我创建专辑时...我可以随意添加很多专辑...但是当我提交表单时...每个AlbumHasMusic都有一个空专辑,而音乐和位置都可以。

如何将专辑ID放入每个AlbumHasMusic?

这些是我的实体:

Album

/**
 * Album
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\AlbumRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Album
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="titre", type="string", length=255)
     */
    private $titre;

    /**
     * @var UploadedFile
     */
    private $cover;

    /**
     * @var String
     *
     * @ORM\Column(name="filename", type="string", length=255, nullable=true)
     */
    private $covername;

    /**
     *
     * @var Array<AlbumHasMusiques>
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\AlbumHasMusiques", mappedBy="album", cascade={"persist"})
     */
    private $albumHasMusiques;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="updated", type="time", nullable=true)
     */
    private $updated;
}


AlbumHasMusic

/**
 * AlbumHasMusiques
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\AlbumHasMusiquesRepository")
 */
class AlbumHasMusiques
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Album
     *
     * @ORM\ManyToOne(targetEntity="Album")
     * @ORM\JoinColumn(name="album_id", referencedColumnName="id")
     */
    private $album;

    /**
     * @var Musique
     *
     * @ORM\ManyToOne(targetEntity="Musique")
     * @ORM\JoinColumn(name="musique_id", referencedColumnName="id")
     */
    private $musique;

    /**
     * @var integer
     *
     * @ORM\Column(name="position", type="integer")
     */
    private $position;

}


Music

/**
 * Musique
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\MusiqueRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Musique
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="duree", type="time", nullable=true)
     */
    private $duree;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="updated", type="time", nullable=true)
     */
    private $updated;

    /**
     * @var string
     */
    private $file;

    /**
     * @var String
     *
     * @ORM\Column(name="filename", type="string", length=255, nullable=true)
     */
    private $filename;

    /**
     * @var string
     *
     * @ORM\Column(name="titre", type="string", length=255, nullable=true)
     */
    private $titre;

    /**
     * @var Genre
     *
     * @ORM\ManyToOne(targetEntity="Genre", inversedBy="musiques")
     * @ORM\JoinColumn(name="genre_id", referencedColumnName="id", nullable=false)
     */
    private $genre;

    /**
     * @ORM\ManyToMany(targetEntity="MotClef", inversedBy="musiques")
     */
    private $motsClef;
}


我想做一些像Galeries和Sonata Media Bundle一样的媒体。

这是我的AlbumAdmin

class AlbumAdmin extends Admin
{
    /**
     * @param FormMapper $formMapper
     */
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('titre')
            ->add('covername')
            ->add('updated')
            ->add('albumHasMusiques', 'sonata_type_collection', array(
                'cascade_validation' => true,
                'by_reference'       => false,
            ), array(
                    'edit'              => 'inline',
                    'inline'            => 'table',
                    'sortable'          => 'position',
                    'link_parameters'   => array('context' => 'default'),
                    'admin_code'        => 'app.admin.album_has_musiques',
                )
            )
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function prePersist($album)
    {
        $album->setAlbumHasMusiques($album->getAlbumHasMusiques());
    }

    /**
     * {@inheritdoc}
     */
    public function preUpdate($album)
    {
        $album->setAlbumHasMusiques($album->getAlbumHasMusiques());
    }
}


和AlbumHasMusicAdmin:

class AlbumHasMusiquesAdmin extends Admin
{
    /**
     * @param FormMapper $formMapper
     */
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('musique', 'sonata_type_model_list', array('required' => true), array(
                 'link_parameters' => ['context' => 'default'],
            ))
            ->add('position', 'hidden')
        ;
    }
}


你有什么主意吗 ?

最佳答案

我认为您错过了相册实体中addAlbumHasMusiques()函数中的某些内容:确保您这样写:

 public function addAlbumHasMusiques(\AppBundle\Entity\AlbumHasMusiques $albumHasMusiques) {
    $albumHasMusiques->setAlbum($this);  // The important line !!!!
    $this->albumHasMusiques[] = $albumHasMusiques;

    return $this;
 }

09-26 14:26