【问题标题】:How to convert Doctrine2 entity graph to array如何将 Doctrine2 实体图转换为数组
【发布时间】:2012-03-04 22:21:01
【问题描述】:

我有以下实体

我想要做的是当我通过 id 获取产品时,我想将其转换为数组,包括所有关联实体,包括它们的关联条目。

结果数组需要可序列化。

【问题讨论】:

    标签: orm doctrine-orm


    【解决方案1】:

    使用理论查询生成器和 HYDRATE_ARRAY 水合模式?

    编辑:抱歉没有包括示例,我当时正在使用手机。查看the blog post 我写了一些与此半相关的学说的良好实践。

    对于代码示例,我要编写的存储库方法如下所示(我会避免使用 p c 等缩写,因为它会使您的代码可读性降低很多(至少在您教义入门...)

    <?php
    
    namespace Vendor\Prefix\Repository;
    
    use Doctrine\ORM\EntityRepository;
    
    class ProductRepository extends EntityRepository
    {
        public function find($id)
        {
            // $em is the entity manager
            $qb = $em->createQueryBuilder();
    
            $qb
                ->select('product', 'category', 'tag', 'brand', 'category_child')
                // Or SomeBundle:Product if you're on symfony
                ->from('Vendor\Prefix\Entity\Product', 'product')
                // You need to explicitly fetch join all your 
                // associations...and select them
                ->leftJoin('product.Brand', 'brand')
                ->leftJoin('product.Tags', 'tag')
                ->leftJoin('product.Categories', 'category')
                ->leftJoin('category.Children', 'category_child')
                // Use prepared statments...its a good habit
                ->where($qb->expr()->eq('product.ID', ':id'))
                ->setParameter('id', $id)
            ;
    
            $query = $qb->getQuery();
    
            // Potential Hydration Modes
            // --------------------------------
            // Doctrine\ORM\Query::HYDRATE_OBJECT
            // Doctrine\ORM\Query::HYDRATE_ARRAY 
            // Doctrine\ORM\Query::HYDRATE_SCALAR
            // Doctrine\ORM\Query::HYDRATE_SINGLE_SCALAR
            // Doctrine\ORM\Query::HYDRATE_SIMPLEOBJECT
    
            // Hydrate the result as an array to get the requested format
            // When you use array hyrdation doctrine does it according 
            // to your entity graph
            return $query->getResult(Doctrine\ORM\Query::HYDRATE_ARRAY);
        }
    }
    

    【讨论】:

    • 我对教义2很陌生。你能给我一些代码示例吗?
    • 感谢您的编辑。不使用缩写是个好主意。如果您查看我对@S0pra 的评论,我设法让它工作。事件获取产品的类别父类别,但由于某种原因我无法获得产品类别的子类别(pheww ..)
    【解决方案2】:

    我认为你需要在 DQL 语法中使用 JOIN:

    $results = $entityManager->executeQuery('SELECT p FROM Product p JOIN p.Brand b JOIN p.Tags t JOIN p.Categories c')->getArrayResult();
    var_dump($results);
    

    另外,我认为您应该避免班级成员以大写字母开头。它可能会与实体名称产生一些混淆。

    【讨论】:

    • 太好了。我修改它像这样` $dql = 'SELECT p, b, c, t, cp FROM \App\Domain\Entity\Product p LEFT JOIN p.Brand b LEFT JOIN p.Categories c LEFT JOIN c.Parent cp LEFT JOIN p.Tags t WHERE p.ID = ?1';` 现在它也检索产品类别的父级。唯一缺少的是产品类别的子项。如果我添加LEFT JOIN c.Children cc,结果返回空数组
    猜你喜欢
    • 1970-01-01
    • 2015-07-02
    • 2011-06-18
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2011-11-13
    相关资源
    最近更新 更多