我设置了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
答案 0 :(得分:2)
在您的reverseTransform()
方法中,您正在使用此行搜索单个标记:
$tag = $this->em->getRepository('JM\BlogBundle\Entity\Tag')->findBy(array('name' => $strTag));
但是,findBy()
将始终返回ArrayCollection,即使只找到一个结果。尝试使用findOneBy()
,它只返回没有ArrayCollection包装器的结果。
此外,对于某些现有技术,请查看FPNTagBundle和Taggable Doctrine Extension。特别是,TagManager可能有一些优化,您可以在自己的代码中实现。