我的实体字段,查询构建器和OneToOne
关系存在问题。
当我在表单类中创建带有query_builder
的实体字段时,当我设置select ('u.id, u.username')
时,我得到例外:
>need array or object, integer given.
当我设置select('u')
时很好,但我得到OneToOne
关系的列,而Doctrine
会生成x个额外的SELECT
个查询。
我该怎么做?
编辑:更详细信息
例如,我有两个具有oneToOne关系的实体,User和Contact:
<?php
namespace Nuvola\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* User
*
* @ORM\Table()
* @ORM\Entity
*/
class User
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="password", type="string", length=128)
*/
private $password;
/**
* @var Contact
* @ORM\OneToOne(targetEntity="Contact", mappedBy="user")
**/
private $contact;
}
-
<?php
namespace Nuvola\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Contact
*
* @ORM\Table()
* @ORM\Entity
*/
class Contact
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="email", type="string", length=128)
*/
private $email;
/**
* @var integer
*
* @ORM\Column(name="phone", type="integer")
*/
private $phone;
/**
* @var string
*
* @ORM\Column(name="skype", type="string", length=128)
*/
private $skype;
/**
* @var User
* @ORM\OneToOne(targetEntity="User", inversedBy="contact")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
**/
private $user;
}
和表单类:
<?php
namespace Nuvola\UserBundle\Form;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class ContactType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email')
->add('phone')
->add('skype')
->add('user', 'entity', [
'class' => 'NuvolaUserBundle:User',
'property' => 'name',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('user')->orderBy('user.name', 'ASC');
}
]);
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Nuvola\UserBundle\Entity\Contact'
));
}
/**
* @return string
*/
public function getName()
{
return 'nuvola_userbundle_contact';
}
}
然后我渲染这个表单类,我从oneToOne User中选择X.
答案 0 :(得分:3)
鉴于,您有以下架构:用户 - &gt;地址。
要仅触发一个查询,请使用以下命令:
$qb
->select('u', 'a')
->leftJoin('u.address', 'a');