Symfony 2实体连接或doctrine查询连接

时间:2014-10-26 00:08:18

标签: symfony join doctrine entity

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

/**
 * accountsUsers
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class accountsUsers
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    public $id;
    /**
     * @var string
     *
     * @ORM\Column(name="userid",type="integer")
     */
    public $userid;
    /**
     * @var string
     *
     * @ORM\Column(name="roleid",type="integer")
     */
    public $roleid;
    /**
     * @var string
     * admin,adviser,etc
     * @ORM\Column(name="roleType", type="string", length=255)
     */ 
    public $roleType;
    /**
     * @var string
     *
     * @ORM\Column(name="firstname", type="string", length=255)
     */
    public $firstname;
    /**
     * @var string
     *
     * @ORM\Column(name="lastname", type="string", length=255)
     */
    public $lastname;
    /**
     * @var string
     *
     * @ORM\Column(name="company", type="string", length=255)
     */
    public $company;
    /**
     * @var string
     *
     * @ORM\Column(name="url", type="string", length=255)
     */
    public $url;
    /**
     * @var string
     *
     * @ORM\Column(name="phone", type="string", length=255)
     */
    public $phone;
    /**
     * @var string
     *
     * @ORM\Column(name="phone2", type="string", length=255)
     */
    public $phone2;
    /**
     * @var string
     *
     * @ORM\Column(name="address", type="string", length=255)
     */
    public $address;
    /**
     * @var string
     *
     * @ORM\Column(name="address2", type="string", length=255)
     */
    public $address2;
    /**
     * @var string
     *
     * @ORM\Column(name="city", type="string", length=255)
     */
    public $city;
    /**
     * @var string
     *
     * @ORM\Column(name="state", type="string", length=255)
     */
    public $state;
    /**
     * @var string
     *
     * @ORM\Column(name="zip", type="string", length=255)
     */
    public $zip;
    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255)
     */
    public $email;
    /**
     * @var string
     *
     * @ORM\Column(name="password", type="string", length=255)
     */
    public $password;
}

/**
 * accounts
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class accounts
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    public $id;
    /**
     * @var string
     *
     * @ORM\Column(name="partnerid", type="string", length=100)
     */
    public $partnerid;
    /**
     * @var \DateTime
     *
     * @ORM\Column(name="subscribedate", type="date")
     */
    public $subscribedate;
    /**
     * @var string
     *
     * @ORM\Column(name="connectionType", type="string", length=100)
     */
    public $connectionType;
    /**
     * @var string
     *
     * @ORM\Column(name="recordkeeperTpaid", type="string", length=100)
     */
    public $recordkeeperTpaid;
    /**
     * @var string
     *
     * @ORM\Column(name="recordkeeperAdviceProviderCd", type="string", length=100)
     */
    public $recordkeeperAdviceProviderCd;
    /**
     * @var string
     *
     * @ORM\Column(name="recordkeeperUrl", type="string", length=200)
     */
    public $recordkeeperUrl;
    /**
     * @var string
     *
     * @ORM\Column(name="recordkeeperUser", type="string", length=100)
     */
    public $recordkeeperUser;
    /**
     * @var string
     *
     * @ORM\Column(name="recordkeeperPass", type="string", length=100)
     */
    public $recordkeeperPass;
    /**
     * @var string
     *
     * @ORM\Column(name="recordkeeperPortfoliosAvailable", type="smallint")
     */
    public $recordkeeperPortfoliosAvailable;
    /**
     * @var string
     *
     * @ORM\Column(name="recordkeeperRiskBasedFundsAvailable", type="smallint")
     */
    public $recordkeeperRiskBasedFundsAvailable;
    /**
     * @var string
     *
     * @ORM\Column(name="investmentsMinScore", type="integer")
     */
    public $investmentsMinScore;
    /**
     * @var string
     *
     * @ORM\Column(name="investmentsMaxScore", type="integer")
     */
    public $investmentsMaxScore;
    /**
     * @var string
     *
     * @ORM\Column(name="ACAon", type="smallint")
     */
    public $ACAon;
    /**
     * @var string
     *
     * @ORM\Column(name="MSTClientID", type="string", length = 100)
     */
    public $MSTClientID;
}

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

如果没有,我将如何在使用原则的联接中执行此操作。我知道如何使用纯原始sql。

  

实施例。 SELECT * FROM accounts a LEFT JOIN accountsUsers b ON a.id =   b.userid

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

第一种方式:

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

$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

会给你。

第二种方法很简单,只需使用 make:entity 命令

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

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

相关问题