Symfony2多对多单向自动创建关系

时间:2014-12-29 16:54:43

标签: php mysql symfony doctrine-orm

我在DocumentTag个实体之间存在ManyToMany关系,但在添加新的Document时我无法保留Tag

  

警告:spl_object_hash()要求参数1为对象,给定字符串

这是我得到的错误,我正在尝试使用SelectizeJS来创建标签,这是我Document的映射内容

/**
 * @return ArrayCollection
 */
public function getTags()
{
    return $this->tags;
}

/**
 * @param ArrayCollection $tags
 */
public function addTag($tag)
{
    $this->tags->add($tag);
}

<many-to-many field="tags" target-entity="Foo\Bar\Entity\Tag">
    <join-table name="academy_document_tags">
        <join-columns>
            <join-column name="tag_id" referenced-column-name="id" />
        </join-columns>
        <inverse-join-columns>
            <join-column name="document_id" referenced-column-name="id" />
        </inverse-join-columns>
    </join-table>
</many-to-many>

我正在使用它来创建表单

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('tags', new TagsType(), array(
            'attr' => array(
                'class' => 'input-tags'
            )
        ))
    ;
}

TagsType有一个DataTransformer

class TagsType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addViewTransformer(new TagsTransformer());
    }

    public function getParent()
    {
        return 'text';
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Foo\Bar\Entity\Tag'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'foobar_tag';
    }
}


class TagsTransformer implements DataTransformerInterface
{
    public function transform($tags)
    {
        $tags = $tags->toArray();

        if (count($tags) < 1)
            return '';
        else
            return implode(',', $tags);
    }

    public function reverseTransform($string)
    {
        $tags = new ArrayCollection();
        $tagsArray = explode(',', $string);

        if (count($tagsArray) > 0)
            $tags = new ArrayCollection($tagsArray);

        return $tags;
    }
}

我们的想法是让Tag实体仅包含idnameslug字段,因为我想使用与Tag具有ManyToMany关系的其他实体,因此使用双向不是一种选择。

我不知道我的错误在哪里,也许在做addTag($tag)时,我调试了它,一切似乎都正确,它将一个新元素传递给ArrayCollection项...

0 个答案:

没有答案
相关问题