2012-02-15 42 views
0

我试图创建一个简单的形式奏鸣曲束。我有一个问题要加载数据的实体类型字段。我知道这是工作:Symfony2的QueryBuilder的联接不工作

$formMapper->add('foo', 'entity', array(
    'class'   => 'myVendorMyBundleBundle:Foo', 
    'property'  => 'id', 
    'query_builder' => function(FooRepository $er) { 
     return $er->createQueryBuilder('qb') 
     ->add('select', 'f') 
     ->add('from', 'myVendorMyBundleBundle:Foo f') 
    }, 
'label'   => 'foo' 
));     

的问题是,我不希望显示实体ID,我想表明它的名字,这在relationed表。我尝试在createQueryBuilder方法中使用join语句,但我没有得到它的工作:

$formMapper->add('foo', 'entity', array(
    'class'   => 'myVendorMyBundleBundle:Foo', 
    'property'  => 'b.name', 
    'query_builder' => function(FooRepository $er) { 
     return $er->createQueryBuilder('qb') 
     ->add('select', 'f') 
     ->add('from', 'myVendorMyBundleBundle:Foo f') 
     ->add('join', 'myVendorMyBundleBundle:Bar b') 
    }, 
'label'   => 'foo' 
));     

任何人都知道如何做到这一点?

谢谢。

+0

请加上你收到的错误。 – 2012-02-15 16:45:06

+0

我不明白为什么使用类似这样的东西,而不是为了使自己的旧的更快的sql字符串 – dynamic 2012-02-15 16:45:53

+0

我得到这个错误试图获取名称属性: 既不属性“nom”也不是方法“getName()”或方法“isName()”存在于类“MyBundle \实体\富 名称是酒吧实体属性,看来我只能得到一个从Foo实体... – carlosbuz 2012-02-16 13:12:36

回答

0

你应该让你使用的是实体__toString()方法,Symfony的将自动使用它作为标签。

编辑: 在你myVendorMyBundleBundle:Foo类,你应该有一个变量$bar定义

<?php 

// ../app/src/myVendor/MyBundleBundle/Entity/Foo.php 

public function __toString() 
{ 
    // If relationship is many to one or one to one 
    return $this->bar->getSomeProperty(); 

    //If relationship is one to many or many to many 
    $return_var = ''; 
    foreach($this->bars as $bar) 
    { 
     $return_var .= $bar->getSomeProperty() . ' '; 
    } 

    return $return_var 
} 

主义将延迟加载在联想(不是一个问题,如果您正在使用的标签的低/单数工作)。 ..我用这种方法有效地做了你所描述的

<?php 
$b->add('foo', 'entity', array(
    'class' => 'myVendorMyBundleBundle:Foo', 
));  
+0

嗨皮特,感谢信息,但它只是为Foo实体工作,我想从酒吧实体选择数据。 – carlosbuz 2012-02-16 10:01:16

+0

如果你已经在正确的映射定义你们的关系。在我的编辑显示你的'__toString()'方法可能看起来 – 2012-02-16 14:45:24