简体   繁体   中英

Symfony + Sonata, OneToMany Relation

Could anyone give me a hand please?

I need to implement the list of books and readers using Sonata admin bundle.

The problem is that I get empty column of read books for each reader in the list.

Forein keys are written okay to the DB.

Please see the code:

ReadersAdmin Class

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->add('name')
        ->add('book',
            'entity',
            array(
                'class'    => 'AppBundle:Books',
                'property' => 'name',
                'multiple' => true,
                'expanded' => true
            )
        );
}

/**
 * @param \Sonata\AdminBundle\Show\ShowMapper $showMapper
 *
 * @return void
 */
protected function configureShowField(ShowMapper $showMapper)
{
    $showMapper
        ->add('name')
        ->add('book')
    ;
}

/**
 * @param \Sonata\AdminBundle\Datagrid\ListMapper $listMapper
 *
 * @return void
 */
protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->add('name')
        ->add('book')
        ->add('_action', 'input', array(
            'actions' => array(
                'show' => array(),
                'edit' => array(),
                'delete' => array(),
            )
        ))
    ;
}

ReadersRelations Entity

 class ReadersRelations
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Books
     *
     * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\Books", inversedBy="ReadersRelations")
     * @ORM\JoinColumn(name="book_id", referencedColumnName="id")
     */
    private $book;

    /**
     * @var Readers
     *
     * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\Readers", inversedBy="ReadersRelations")
     * @ORM\JoinColumn(name="reader_id", referencedColumnName="id")
     */
    private $reader;

Books Entity

    <?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
 * Books
 *
 * @ORM\Entity
 * @ORM\Table(name="Books")
 */
class Books
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     *
     */
    private $id;

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

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

    /**
     * @var ReadersRelations
     *
     * @ORM\OneToMany(targetEntity="\AppBundle\Entity\ReadersRelations" , mappedBy="Books" , cascade={"all"})
     */
    private $readers;

    public function __toString()
    {
        return $this->name;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Books
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set author
     *
     * @param string $author
     * @return Books
     */
    public function setAuthor($author)
    {
        $this->author = $author;

        return $this;
    }

    /**
     * Get author
     *
     * @return string 
     */
    public function getAuthor()
    {
        return $this->author;
    }
}

Readers Entity

    <?php

    namespace AppBundle\Entity;

    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    use AppBundle\Entity\ReadersRelations;
    /**
     * Readers
     *
     * @ORM\Entity
     * @ORM\Table(name="Readers")
     */
    class Readers
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")     *
         */
        private $id;

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

        /**
         * @var ReadersRelations
         *
         * @ORM\OneToMany(targetEntity="\AppBundle\Entity\ReadersRelations" , mappedBy="Readers" , cascade={"all"})
         */
        private $book;

        private $books;

        public function __construct()
        {
            $this->book = new ArrayCollection();
            $this->books = new ArrayCollection();

        }

        public function __toString()
        {
            return $this->name;
        }

        public function getBook()
        {
            $books = new ArrayCollection();

            foreach($books as $p)
            {
                $books[] = $p->getBook();
            }

            return $books;
        }

        public function setBook($books)
        {
            foreach($books as $p)
            {
                $po = new ReadersRelations();

                $po->setBook($p);
                $po->setReader($this);

                $this->addPo($po);
            }

        }

        public function addPo($ProductOrder)
        {
            $this->book[] = $ProductOrder;
        }

        public function removePo($ProductOrder)
        {
            return $this->book->removeElement($ProductOrder);
        }
    class Readers
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")     *
         */
        private $id;

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

        /**
         * @var ReadersRelations
         *
         * @ORM\OneToMany(targetEntity="\AppBundle\Entity\ReadersRelations" , mappedBy="Readers" , cascade={"all"})
         */
        private $book;

        private $books;


        public function __construct()
        {
            $this->book = new ArrayCollection();
            $this->books = new ArrayCollection();

        }

        public function __toString()
        {
            return $this->name;
        }

        public function getBook()
        {
            $books = new ArrayCollection();

            foreach($books as $p)
            {
                $books[] = $p->getBook();
            }

            return $books;
        }

        public function setBook($books)
        {
            foreach($books as $p)
            {
                $po = new ReadersRelations();

                $po->setBook($p);
                $po->setReader($this);

                $this->addPo($po);
            }

        }

        public function addPo($ProductOrder)
        {
            $this->book[] = $ProductOrder;
        }
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Readers
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
}

So, have you problem for store data using your relationship ? Or juste for get data in list ?

If it's for save data, try to implement Sonata type collection or Sonata type model field types for register new related entries.

Then, if you have any problems, we will check if your entities setters have missing actions.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM