3

我有一个用于帖子的表格和另一个带有回复帖子的表格。我在教义中正确映射了一个(帖子)到多个(回复帖子)的关系。我可以加入两者并得到我所期望的,每个回复的数组数组,但原始帖子的内容是相同的。是否可以为每个帖子返回一个数组/对象,并将回复内容放在一个数组中?

这是我现在得到的(如预期的那样):

array (size=2)
  0 => 
    array (size=2)
      'content' => string 'Test homework post' (length=18)
      'replyContent' => string 'this is a reply' (length=15)
  1 => 
    array (size=2)
      'content' => string 'Test homework post' (length=18)
      'replyContent' => string 'second reply' (length=12)

我想要这样的东西:

array (size=1)
  0 => 
    array (size=2)
      'content' => string 'Test homework post' (length=18)
      'replyContent' => 
                   array (size = 2)
                       0 => 'replyContent' => string 'this is a reply' (length=15)
                       1 => 'replyContent' => string 'second reply' (length=12)

我已经做了最好的研究,但只遇到了关于返回数组而不是对象的结果。也许这是不可能的,但我认为它可能正在考虑 php 类定义中的一对多关系映射:

$this->[name for protected variable] = new ArrayCollection();

非常感谢您的帮助!

编辑:这是我的学说查询:

        SELECT
            homeworkPost.content,
            homeworkPostReplies.content AS replyContent
        FROM AcmeMainBundle:HomeworkPost homeworkPost
        LEFT JOIN homeworkPost.homeworkPostReplies homeworkPostReplies 
        WHERE homeworkPost.course = :course
4

2 回答 2

2

我遇到了同样的问题并找到了解决方案,所以我将其作为参考:我正在使用的代码片段

    $query = $this->em->createQueryBuilder();
    $query->select("partial venue.{id,name,description,state,city,street,postalCode,lon,lat},partial r.{id}")
    ->from("CoreBundle:ServiceProvider","venue")
    ->join("venue.reviews","r","with","IDENTITY(r.serviceProvider) = venue.id")
    ->andWhere("venue.city = :city_name")
    ->andWhere("IDENTITY(venue.venueStatus) != 1")
    ->andWhere("IDENTITY(venue.venueStatus) != 3")
    ->setParameter("city_name",$cityName)
    ->orderBy("venue.points" ,"DESC")
    ->addOrderBy("venue.name" ,"ASC");

使用 partial 将解决此问题参考14. Doctrine Query Language — Doctrine 2 ORM 2 文档 - 14.2.4.1。部分对象语法

于 2017-02-15T16:20:41.643 回答
0

现在更新DQL 已发布。

做这个:

SELECT
    homeworkPost.content,
    homeworkPostReply.content
FROM AcmeMainBundle:HomeworkPost homeworkPost
LEFT JOIN AcmeMainBundle:HomeworkPostReply homeworkPostReply 
WHERE homeworkPost.course = :course

您需要加入 HomeworkPostReply 实体


如果您的教义结果是正确的,那么

$qb->getQuery()->getArrayResult();

应该可以解决您的问题。

您还可以处理结果数据后查询:

$result = array();

$formatResult = function($post, $k) use (&$result)
{
    $found = false;
    for($i = 0, $count = count($result); $i < $count; $i++)
    {
        if($result[$i]['content'] == $post['content'])
        {
            $found = true;
            if(!isset($result[$i]['replyContent']))
            {
                $result[$i]['replyContent'] = array();
            }
            $result[$i]['replyContent'][]= $post['replyContent'];
            break;
        }
    }
    if(!$found){
        $result[] = array('content'=>$post['content'],
                'replyContent'=>array($post['replyContent']));
    }
};

array_walk($originalResult, $formatResult);

print_r($result);
于 2013-03-25T20:40:57.037 回答