Symfony 2 实体连接或学说查询连接

Posted

技术标签:

【中文标题】Symfony 2 实体连接或学说查询连接【英文标题】:Symfony 2 entity join or doctrine query join 【发布时间】:2014-12-21 12:11:25 【问题描述】:

我想知道是否可以将实体配置为自动从另一个实体加载数据。 例如。

/**
 * 帐户用户
 *
 * @ORM\Table()
 * @ORM\实体
 */
类帐户用户

    /**
     * @var 整数
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\ID
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    公共$id;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="userid",type="integer")
     */
    公共$用户ID;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="roleid",type="integer")
     */
    公共 $roleid;
    /**
     * @var 字符串
     * 管理员、顾问等
     * @ORM\Column(name="roleType", type="string", length=255)
     */
    公共$角色类型;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="firstname", type="string", length=255)
     */
    公共$名;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="lastname", type="string", length=255)
     */
    公共$姓氏;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="company", type="string", length=255)
     */
    公共$公司;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="url", type="string", length=255)
     */
    公共 $url;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="phone", type="string", length=255)
     */
    公共$电话;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="phone2", type="string", length=255)
     */
    公共$电话2;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="address", type="string", length=255)
     */
    公共$地址;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="address2", type="string", length=255)
     */
    公共$地址2;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="city", type="string", length=255)
     */
    公共$城市;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="state", type="string", length=255)
     */
    公共$状态;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="zip", type="string", length=255)
     */
    公共 $zip;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="email", type="string", length=255)
     */
    公共$电子邮件;
    /**
     * @var 字符串
     *
     * @ORM\Column(name="password", type="string", length=255)
     */
    公共$密码;

/** * 帐户 * * @ORM\Table() * @ORM\实体 */ 班级账户 /** * @var 整数 * * @ORM\Column(name="id", type="integer") * @ORM\ID * @ORM\GeneratedValue(strategy="AUTO") */ 公共$id; /** * @var 字符串 * * @ORM\Column(name="partnerid", type="string", length=100) */ 公共 $partnerid; /** * @var \日期时间 * * @ORM\Column(name="订阅日期", type="date") */ 公共$订阅日期; /** * @var 字符串 * * @ORM\Column(name="connectionType", type="string", length=100) */ 公共$连接类型; /** * @var 字符串 * * @ORM\Column(name="recordkeeperTpaid", type="string", length=100) */ 公共 $recordkeeperTpaid; /** * @var 字符串 * * @ORM\Column(name="recordkeeperAdviceProviderCd", type="string", length=100) */ 公共 $recordkeeperAdviceProviderCd; /** * @var 字符串 * * @ORM\Column(name="recordkeeperUrl", type="string", length=200) */ 公共 $recordkeeperUrl; /** * @var 字符串 * * @ORM\Column(name="recordkeeperUser", type="string", length=100) */ 公共 $recordkeeperUser; /** * @var 字符串 * * @ORM\Column(name="recordkeeperPass", type="string", length=100) */ 公共 $recordkeeperPass; /** * @var 字符串 * * @ORM\Column(name="recordkeeperPortfoliosAvailable", type="smallint") */ 公共 $recordkeeperPortfoliosAvailable; /** * @var 字符串 * * @ORM\Column(name="recordkeeperRiskBasedFundsAvailable", type="smallint") */ 公共 $recordkeeperRiskBasedFundsAvailable; /** * @var 字符串 * * @ORM\Column(name="investmentsMinScore", type="integer") */ public $investmentsMinScore; /** * @var 字符串 * * @ORM\Column(name="investmentsMaxScore", type="integer") */ 公共 $investmentsMaxScore; /** * @var 字符串 * * @ORM\Column(name="ACAon", type="smallint") */ 公共$ACAon; /** * @var 字符串 * * @ORM\Column(name="MSTClientID", type="string", 长度 = 100) */ 公共 $MSTClientID;

是否可以设置accountsUsers在findby、findbyone等访问accountsUsers时自动加载所有accounts数据,关系是accountsUsers.userid = accounts.id。

如果没有,我将如何在使用原则的连接中执行此操作。我知道如何使用纯原始 sql 来做到这一点。

例如。 SELECT * FROM accounts a LEFT JOIN accountsUsers b ON a.id = b.用户名

【问题讨论】:

手册是开始学习 Doctrine 2 关系的好地方。 symfony.com/doc/current/book/doctrine.html 我查看了手册,它对我一点帮助都没有。 没关系,我明白了!我不得不非常缓慢地完成这个例子,哈哈。 【参考方案1】:

仅通过使用注释无法在一个查询(即使用 JOIN)中加载单独的实体。您必须在您的存储库中定义一个自定义查询,该查询通过 DQLQueryBuilder 指示 Doctrine 加入相关实体。

这对我来说也是一个很大的问题,但是在定义关联的注释中使用 fetch="EAGER" 实际上并没有使用 JOIN 来检索结果 - 它只是发出 2 个单独的查询来预填充关系这样它的第一次访问就不会触发延迟加载过程。

有关详细信息,另请参阅this question。

【讨论】:

【参考方案2】:

Symfony 开发了关系,使您能够在实体文件中定义属性并将其与其他实体相关联。 有两种方法。

第一种方式:

在你的情况下, 首先,您必须在用户表中创建一个列(例如将其命名为 account)并使用外键将其与 account.id 列关联,然后在 App\Entity\Accounts 中您可以定义一个属性名称 $users 并将其关联到 App\Entity\Users 如下代码:

   /**
     * @ORM\OneToMany(targetEntity="App\Entity\Users", mappedBy="account")
     */
    private $users;

还有一个App\Entity\Users

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Accounts", inversedBy="users")
     */
    private $Account;

每当你从App\Entity\Accounts 得到一个对象时,就像这样 一个名为 users 的键将返回包含所有此帐户用户的信息的结果:

    SELECT * FROM accounts a LEFT JOIN accountsUsers b ON a.id = b.userid

会给你的。

第二种方式非常简单,只需使用 make:entity 命令即可

php bin/console make:entity

您可以创建一个新列并为其建立关系,命令将逐步询问您所有内容,使用它非常简单,您无需阅读文档,但如果您需要更多信息这是阅读它的链接 https://symfony.com/doc/current/doctrine/associations.html#the-manytoone-onetomany-association

【讨论】:

以上是关于Symfony 2 实体连接或学说查询连接的主要内容,如果未能解决你的问题,请参考以下文章

学说2:在多对多关系中引用连接表

Symfony学说OneToAll关系

使用连接表返回结果的学说不起作用 Symfony2

学说(连接)类表继承中根实体的查询字段

如何限制joinLeft()结果的学说?

如何让 Symfony 2 与学说 ORM 只保留一次相关实体