【问题标题】:ZF2 Doctrine2 repository result as arrayZF2 Doctrine2 存储库结果为数组
【发布时间】:2015-04-09 11:47:31
【问题描述】:

我有一个问题,我有两个控制器。一个是restful控制器,它只处理json数据并返回一个JsonModel,另一个是一个默认控制器,它返回一个ViewModel 现在我遇到了问题,我的方法只返回 array 的实体,这对于默认控制器是正确的,但是我的 restful 控制器需要将实体作为数组。我该如何处理?

膳食控制器

class MealController extends AbstractRestfulController {
    protected $mealService;

    public function getList() {
        $meals = $this->mealService->getAllMeals();

        return new JsonModel($meals);
    }
}

餐饮服务

class MealService {
    protected $mealRepository;

    public function getAllMeals() {
        return $this->mealRepository->findAll();
    }
}

MealRepository

class MealRepository extends EntityRepository {
    public function findAll() {
        $queryBuilder = $this->createQueryBuilder('meal')
            ->orderBy('title');

        return $queryBuilder->getQuery()->getResult();
    }
}

【问题讨论】:

    标签: php doctrine-orm zend-framework2


    【解决方案1】:

    您可以使用Array Hydration。它允许在执行查询时指定水合模式,并更改返回结果的数据类型。您只需在 getResult() 方法中使用常量 Query::HYDRATE_ARRAY 作为参数:

    public function findAll() {
        $queryBuilder = $this->createQueryBuilder('meal')
            ->orderBy('title');
    
        return $queryBuilder->getQuery()->getResult(Doctrine\ORM\Query::HYDRATE_ARRAY);
    }
    

    也许你也可以看看EntitySerializer 类,它可以让你从一个实体创建一个 json 数组:

    $entitySerializer = new EntitySerializer($em);
    $entityAsArray = $entitySerializer->toArray($entity);
    

    【讨论】:

    • Array Hydration 看起来不错,但这样一来,该方法总是返回一个数组。但是在我的服务方法“getAllMeals”和存储库方法“findAll”中添加一个参数 $hydration 也感觉很奇怪,或者这是正确的方法吗?所以我会:public function getAllMeals($hydration = Doctrine\ORM\Query::HYDRATE_OBJECT) ; public function findAll($hydration = Doctrine\ORM\Query::HYDRATE_OBJECT) ;
    • 我不知道是否有更好的方法,但是是的,您最终可以这样做,这并不奇怪 ;-)
    • 好吧,我就那样做!谢谢;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多