实体表单上的查询构建器在OneToOne关系上生成批量选择

时间:2014-11-26 11:07:45

标签: symfony doctrine-orm symfony-forms

为了更好地理解,我将简单地介绍上下文。

我有一个具有BankAccount关系的用户实体。

在这里,我的用户类:

/**
 * User
 *
 * @ORM\Table(name="fos_user")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 */
class User extends BaseUser
{

    // [...]


    /**
     * @ORM\OneToOne(targetEntity="AppBundle\Entity\BankAccount", mappedBy="customer")
     */
    private $bankAccount;

    // [...]
}

我的银行帐户类:

/**
 * BankAccount
 *
 * @ORM\Table(name="bank_account")
 * @ORM\Entity
 * @DoctrineAssert\UniqueEntity({"iban"})
 * @DoctrineAssert\UniqueEntity({"mandateRef"})
 * @ORM\HasLifecycleCallbacks
 */
class BankAccount
{
    // [...]

    /**
     * @var User
     *
     * @ORM\OneToOne(targetEntity="AppBundle\Entity\User", inversedBy="bankAccount")
     * @ORM\JoinColumn(name="customer_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $customer;

    // [...]
}

我想创建一个过滤器表单,该表单将成为具有一些orderBy语句的用户的基本实体类型。我将使用query_builder选项:

->add('customer', null, array(
    'query_builder' => function (UserRepository $er) {
        return $er->createQueryBuilder('u')
            ->select('u')
            ->orderBy('u.firstname, u.lastname, u.username')
        ;
    },
    'property' => 'fullnameWithUsername',
))

这将为每个用户生成很多由doctrine制作的BankAccount选择:

enter image description here

如果我停用了查询构建器,则不再需要选择其他选项,但我们在用户选择时有一个左连接:

enter image description here

所以解决办法可能是按照here所述在我的查询构建器上手动添加连接语句,但我认为它非常难看,顺便说一下,我绝对不需要用户和#39;此表格的银行帐户。

所以我的问题是:如何告诉Doctrine并不总是试图获取用户的银行帐户关系?

注意:我已经在两个实体上尝试了所有提取选项,但无法正常工作。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果您将OneToOne关系更改为OneToMany(即使它确实不是),Doctrine将停止加载银行帐户实体。

很脏,但据我所知,除此之外别无他法。