【问题标题】:Symfony2 + Doctrine2 / building a form from 2 joined entity objectsSymfony2 + Doctrine2 / 从 2 个连接的实体对象构建一个表单
【发布时间】:2012-06-08 07:19:10
【问题描述】:

是否可以从 2 个连接的实体对象构建一个表单?

我有两个实体propertypropertylanguage,它们以onetomany 关系连接。 (一个属性可以有多种语言)

语言有 titledescription 列。 所以一个属性可以有英文、法文、德文标题。

我正在尝试构建一个表单。 见下文。

控制器: addProperty.php

class AddPropertyController extends Controller
{
    // ....

    public function indexAction(Request $request)
    {
        $property = new  property;
        $language = new  propertyLanguage;
        $property ->addpropertylanguage($language);

        $form = $this->createForm(new propertyType($this->getDoctrine()),$property);

       // ..... 

    }

表单类型:propertType.php

public function buildForm(FormBuilder $builder, array $options)
    {

        $builder
            ->add('title', 'text');
           // other ->add() below.

    }

它返回以下错误:

既不是属性“title”,也不是方法“getTitle()”,也不是方法 “isTitle()”存在于类“\defaultBundle\Entity\property”中

当然在property中没有属性Title,但是在propertylanguage中有一个.. 即使我尝试: ->add('title', 'entity', array('class'=>defaultBundle:propertylanguage)); 它不起作用。

感谢您有时间帮助我。

最好的,

皮埃尔。

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    您要做的是创建一个 PropertyLanguageType 类以及一个 PropertyType。

    然后,您将在您的 PropertyType 中嵌入 PropertyLanguageType:

    public function buildForm(FormBuilder $builder, array $options)
    {
    
        // $builder->add('propertyLanguage', new PropertyLanguageType());
    
        // Since we have a 1 to many relation, then a collection is needed
        $builder->add('propertyLanguage', 'collection', array('type' => new PropertyLanguageType()));
    

    PropertyLanguageType 是您添加标题的位置。

    这一切都在手册的表格部分,但可能需要多次阅读。

    第二种方法是向您的 Property 实体添加一个 getTitle,这将从 PropertyLanguage 实体返回标题。通过这样做,您的原始表单将起作用。但是当您开始与多个属性建立多个关联时,它可能会有点混乱。最好只为每个实体定义一个类型。

    【讨论】:

    • 嗨 Cerad,非常感谢,你给了我我需要的东西。它完美无缺!我的声誉还不到 15 岁,所以我无法投票支持您的回复。非常感谢。
    • 谢谢,尽管您似乎应该能够接受答案?无论如何,很高兴我能提供帮助。
    【解决方案2】:

    您可以在定义表单时使用 query_builder。这是您的表单类的外观。当然,它肯定不会完全如此,但这会给你一个好的开始;)

    public function __construct($id)
    {
        $this->propertylanguageId = $id;
    }   
    
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('propertylanguage', 'entity', array(
                        'label' => 'Property Language',
                        'class' => 'YourAdressToBundle:Propertylanguage',
                        'query_builder' => function(EntityRepository $er) use ($propertylanguageId) {
                                                return $er->createQueryBuilder('p')
                                                ->join('p.property', 'prop', Expr\Join::WITH, 'prop.id = :propertylanguageId')
                                                ->setParameter('propertylanguageId', $propertylanguageId);
                                           },
                    ));
    }
    

    希望对你有帮助

    【讨论】:

    • 您好,非常感谢您的时间和帮助。实际上,我更喜欢避免使用 queryBuilder,因为如果我想从实体对象构建表单,我认为它不起作用。例如: $form = $this->createForm(new propertyType($this->getDoctrine()),$property);我会去 wz Cerad 回答,这看起来更像是最佳实践。再次感谢您的宝贵时间
    • 嗨,我自己曾经在一个项目中使用过它,它确实有效,但 Cerad 解决方案当然也有效!快乐编码 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多