实体字段 - queryBuilder-> select()

时间:2014-06-02 06:51:15

标签: forms symfony doctrine-orm one-to-one query-builder

我的实体字段,查询构建器和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.

1 个答案:

答案 0 :(得分:3)

鉴于,您有以下架构:用户 - &gt;地址。

要仅触发一个查询,请使用以下命令:

$qb
    ->select('u', 'a')
    ->leftJoin('u.address', 'a');