为什么我得到一个带有Doctrine 2& Symfony 2数据变压器?

时间:2011-12-12 11:49:18

标签: symfony doctrine-orm

我设置了Symfony 2 Data Transformer,允许用户输入以逗号分隔的字符串列表,并将其转换为Doctrine期望的ArrayCollection。现在问题出在transform(),它将ArrayCollection转换为逗号分隔的字符串。

/**
 * Transform ArrayCollection of Tag's into Comma Separated string
 * 
 * @param ArrayCollection $tags
 * @return string
 */
public function transform($tags) {
    if ($tags == null) 
        return '';

    $tagNames = array();
    var_dump($tags);
    $tags->map(function($tag) use(&$tagNames) {
        $tagNames[] = $tag->getName();
    });
    return implode(', ', $tagNames);
}

$tags看起来像:

object(Doctrine\Common\Collections\ArrayCollection)#222 (1) {
  ["_elements":"Doctrine\Common\Collections\ArrayCollection":private]=>
  array(1) {
    [0]=>
    array(1) {
      [0]=>
      object(JM\BlogBundle\Entity\Tag)#53 (3) {
        ["id":"JM\BlogBundle\Entity\Tag":private]=>
        int(1)
        ["name":"JM\BlogBundle\Entity\Tag":private]=>
        string(4) "blog"
        ["description":"JM\BlogBundle\Entity\Tag":private]=>
        string(0) ""
      }
    }
  }
}

注意它在数组中的数组。那是为什么?

更新:数据转换器代码 - > http://pastie.org/3004780

1 个答案:

答案 0 :(得分:2)

在您的reverseTransform()方法中,您正在使用此行搜索单个标记:

$tag = $this->em->getRepository('JM\BlogBundle\Entity\Tag')->findBy(array('name' => $strTag));

但是,findBy()将始终返回ArrayCollection,即使只找到一个结果。尝试使用findOneBy(),它只返回没有ArrayCollection包装器的结果。

此外,对于某些现有技术,请查看FPNTagBundleTaggable Doctrine Extension。特别是,TagManager可能有一些优化,您可以在自己的代码中实现。