Почему я получаю массив массивов с помощью Doctrine 2 и Symfony 2 Data Transformer? - PullRequest
2 голосов
/ 12 декабря 2011

Я настроил Symfony 2 Data Transformer , который позволит пользователю вводить список строк через запятую и преобразовывать их в ArrayCollection, которую ожидает Doctrine. Теперь проблема в 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 Ответ

2 голосов
/ 29 декабря 2011

Похоже, что в вашем методе reverseTransform() вы ищете один тег с этой строкой:

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

Однако findBy() всегда будет возвращать ArrayCollection, даже если найден только один результат. Попробуйте использовать findOneBy(), который просто вернет результат без оболочки ArrayCollection.

Также, для некоторого уровня техники, проверьте FPNTagBundle и Taggable Doctrine Extension . В частности, TagManager может иметь некоторые оптимизации, которые вы можете реализовать в своем собственном коде.

...