Entity field - queryBuilder->select()

主宰稳场 提交于 2020-01-24 00:21:06

问题


I have a problem with entity field, query builder and OneToOne relationship.

When I created entity field with query_builder in form class and when I set select ('u.id, u.username') I get exception:

>need array or object, integer given.

When I set select('u') is fine but I get columns with OneToOne relationship and Doctrine generates x additional SELECT queries.

What do I have to do?

EDIT: MORE DETAILS

For example I have two entity with oneToOne relation, User and 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;
}

and form class:

<?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';
    }
}

Then I render this form class and i get X select from oneToOne User.


回答1:


Given, you have a schema like the following: User -> Address.

In order to get only one query triggerred, use the following:

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


来源:https://stackoverflow.com/questions/23988749/entity-field-querybuilder-select

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!