简体   繁体   English

Symfony +奏鸣曲,一对多关系

[英]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. 我需要使用Sonata管理员捆绑包实现书籍和读者的列表。

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. 可以将Forein密钥写入数据库。

Please see the code: 请查看代码:

ReadersAdmin Class ReadersAdmin类

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. 如果用于保存数据,请尝试实现Sonata类型集合Sonata类型模型字段类型以注册新的相关条目。

Then, if you have any problems, we will check if your entities setters have missing actions. 然后,如果您有任何问题,我们将检查您的实体设置器是否缺少操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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