Ответы пользователя по тегу Doctrine ORM
  • Как подключить doctrine к zend expressive?

    @novrm
    Как-то так: https://github.com/doctrine/DoctrineORMModule#conn...
    <?php
    return [
        'doctrine' => [
            'connection' => [
                'orm_default' => [
                    'driverClass' => \Doctrine\DBAL\Driver\PDOMySql\Driver::class,
                    'params' => [
                        'host'     => 'localhost',
                        'port'     => '3306',
                        'user'     => 'username',
                        'password' => 'password',
                        'dbname'   => 'database',
                        'driverOptions' => [
                            \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
                        ],
                    ],
                ],
            ],
        ],
    ];
    Ответ написан
    Комментировать
  • Как в Doctrine засетить переменную при подключение?

    @novrm
    Нечто похожее реализовано в модуле запоминания регистрации пользователя.
    Процедура происходит одновременно как через сессии так и через Doctrine.
    goalio/GoalioRememberMe
    goalio/GoalioRememberMeDoctrineORM
    Ответ написан
    Комментировать
  • Doctrine2. Как выбрать и гидрировать связанные коллекции?

    @novrm
    В репозитории сущности Category создаете метод типа getCategory, где создаете подобный запрос.
    Вот только сортировка и количество разных под-коллекций одним запросом не получится.
    Как вариант - потом делать пагинацию и фильтрацию полученного результата.

    public function getCategory()
    {
            $queryBuilder = $this->getEntityManager()->createQueryBuilder();
    
            $queryBuilder
            ->select('category')->from($this->getClassName(), 'category')
            ->addSelect('c_categoryHasPosts')->leftJoin('category.categoryHasPosts', 'c_categoryHasPosts')
                ->addSelect('c_cHasP_post')->leftJoin('c_categoryHasPosts.post', 'c_cHasP_post')
                    ->addSelect('c_cHasP_p_postHasComments')->leftJoin('c_cHasP_post.postHasComments', 'c_cHasP_p_postHasComments')
                        ->addSelect('c_cHasP_p_pHasC_comment')->leftJoin('c_cHasP_p_postHasComments.comment', 'c_cHasP_p_pHasC_comment')
            ->setParameter('categoryId', 1)
            ->setParameter('postId', 1)
            ->andWhere('c_cHasP_post.category_id = :categoryId')
            ->orWhere('c_cHasP_p_pHasC_comment.post_id = :postId')
            
            return $queryBuilder->getQuery()->getResult();
    }
    Ответ написан
  • Какую выбрать схему БД для каталога товаров?

    @novrm
    Вам нужна вот такая схема для БД.

    PMFTUskGQsCLnwYL7hUBTA.jpeg
    Ответ написан
    Комментировать
  • Как написать автогенерацию номера в Doctrina?

    @novrm
    Если вы работаете с Doctrine - у вас должен быть уникальный id типа INT для каждой записи.
    А раз есть уникальный id - вы можете поставить ему автоинкремент. Это стандартное решение вашей задачи.
    Танцы с бубном - лишнее и вредное.

    Ибо...
    Если вы внимательно читали руководство к Doctirne - вы не наступите на грабли начинающего, который любое поле берет за уникальное. Любое - нельзя.

    28.1.1. Join-Columns with non-primary keys

    It is not possible to use join columns pointing to non-primary keys. Doctrine will think these are the primary keys and create lazy-loading proxies with the data, which can lead to unexpected results. Doctrine can for performance reasons not validate the correctness of this settings at runtime but only through the Validate Schema command.
    Ответ написан
  • Как создать связанные записи со связью many-to-many в zend framework, используя doctrine?

    @novrm
    Если поможет, если не поможет - звиняйте...
    Попробуйте вот эти инструменты:
    https://www.mysql.com/products/workbench/
    https://github.com/mysql-workbench-schema-exporter...

    На скорую руку автомат наваял следующие сущности для пробного модуля TestModule:
    b52390696a37424bb2aafa429bc25bf1.jpg
    <?php
    
    /**
     * Auto generated by MySQL Workbench Schema Exporter.
     * Version 3.0.2 (doctrine2-annotation) on 2016-07-26 19:31:50.
     * Goto https://github.com/johmue/mysql-workbench-schema-exporter for more
     * information.
     */
    
    namespace TestModule\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    
    /**
     * TestModule\Entity\Portfolio
     *
     * @ORM\Entity()
     * @ORM\Table(name="Portfolio")
     * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="discr", type="string")
     * @ORM\DiscriminatorMap({"base":"BasePortfolio", "extended":"Portfolio"})
     */
    class BasePortfolio
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         */
        protected $idPortfolio;
    
        /**
         * @ORM\ManyToMany(targetEntity="Tag", mappedBy="portfolios")
         */
        protected $tags;
    
        public function __construct()
        {
            $this->tags = new ArrayCollection();
        }
    
        /**
         * Set the value of idPortfolio.
         *
         * @param integer $idPortfolio
         * @return \TestModule\Entity\Portfolio
         */
        public function setIdPortfolio($idPortfolio)
        {
            $this->idPortfolio = $idPortfolio;
    
            return $this;
        }
    
        /**
         * Get the value of idPortfolio.
         *
         * @return integer
         */
        public function getIdPortfolio()
        {
            return $this->idPortfolio;
        }
    
        /**
         * Add Tag entity to collection.
         *
         * @param \TestModule\Entity\Tag $tag
         * @return \TestModule\Entity\Portfolio
         */
        public function addTag(Tag $tag)
        {
            $this->tags[] = $tag;
    
            return $this;
        }
    
        /**
         * Remove Tag entity from collection.
         *
         * @param \TestModule\Entity\Tag $tag
         * @return \TestModule\Entity\Portfolio
         */
        public function removeTag(Tag $tag)
        {
            $this->tags->removeElement($tag);
    
            return $this;
        }
    
        /**
         * Get Tag entity collection.
         *
         * @return \Doctrine\Common\Collections\Collection
         */
        public function getTags()
        {
            return $this->tags;
        }
    
    }


    <?php
    
    /**
     * Auto generated by MySQL Workbench Schema Exporter.
     * Version 3.0.2 (doctrine2-annotation) on 2016-07-26 19:31:50.
     * Goto https://github.com/johmue/mysql-workbench-schema-exporter for more
     * information.
     */
    
    namespace TestModule\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    
    /**
     * TestModule\Entity\Tag
     *
     * @ORM\Entity()
     * @ORM\Table(name="Tag")
     * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="discr", type="string")
     * @ORM\DiscriminatorMap({"base":"BaseTag", "extended":"Tag"})
     */
    class BaseTag
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         */
        protected $idTag;
    
        /**
         * @ORM\ManyToMany(targetEntity="Portfolio", inversedBy="tags")
         * @ORM\JoinTable(name="Portfolio_has_Tag",
         *     joinColumns={@ORM\JoinColumn(name="Tag_idTag", referencedColumnName="idTag", nullable=false)},
         *     inverseJoinColumns={@ORM\JoinColumn(name="Portfolio_idPortfolio", referencedColumnName="idPortfolio", nullable=false)}
         * )
         */
        protected $portfolios;
    
        public function __construct()
        {
            $this->portfolios = new ArrayCollection();
        }
    
        /**
         * Set the value of idTag.
         *
         * @param integer $idTag
         * @return \TestModule\Entity\Tag
         */
        public function setIdTag($idTag)
        {
            $this->idTag = $idTag;
    
            return $this;
        }
    
        /**
         * Get the value of idTag.
         *
         * @return integer
         */
        public function getIdTag()
        {
            return $this->idTag;
        }
    
        /**
         * Add Portfolio entity to collection.
         *
         * @param \TestModule\Entity\Portfolio $portfolio
         * @return \TestModule\Entity\Tag
         */
        public function addPortfolio(Portfolio $portfolio)
        {
            $portfolio->addTag($this);
            $this->portfolios[] = $portfolio;
    
            return $this;
        }
    
        /**
         * Remove Portfolio entity from collection.
         *
         * @param \TestModule\Entity\Portfolio $portfolio
         * @return \TestModule\Entity\Tag
         */
        public function removePortfolio(Portfolio $portfolio)
        {
            $portfolio->removeTag($this);
            $this->portfolios->removeElement($portfolio);
    
            return $this;
        }
    
        /**
         * Get Portfolio entity collection.
         *
         * @return \Doctrine\Common\Collections\Collection
         */
        public function getPortfolios()
        {
            return $this->portfolios;
        }
    
    }
    Ответ написан
    Комментировать