【问题标题】:Entity field - queryBuilder->select()实体字段 - queryBuilder->select()
【发布时间】:2014-06-02 06:51:14
【问题描述】:

我对实体字段、查询生成器和OneToOne 关系有疑问。

当我在表单类中使用query_builder 创建实体字段并设置选择('u.id, u.username') 时出现异常:

>need array or object, integer given.

当我设置select('u') 时很好,但我得到具有OneToOne 关系的列并且Doctrine 生成x 个额外的SELECT 查询。

我该怎么办?

编辑:更多细节

例如,我有两个具有 oneToOne 关系的实体,用户和联系人:

<?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 用户中获得 X 选择。

【问题讨论】:

  • 你能给我们更多的信息吗?我们可以看到查询吗?
  • 您必须使用JOIN,可能是LEFT JOIN 来获得所有结果,而无需额外查询。但是,如果没有看到您的实体和query,我将无法帮助您
  • ^^^ @bartek 所说的。请向我们展示您的查询...
  • 我更新了有关文件示例的问题。

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


【解决方案1】:

假设,您有如下架构:用户 -> 地址。

为了只触发一个查询,请使用以下命令:

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

【讨论】:

  • 更好,更好,但如果我根本不需要“u.address”怎么办?
  • 老实说,这是我仍然在问自己的一个问题......似乎教义2总是获取onetoone关系......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 2014-10-23
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多