为什么Doctrine自动生成n:1关系?为什么我得到外键修改表的所有实体而不是单个refrenced行?

时间:2018-04-29 11:29:37

标签: php mysql symfony doctrine

我是symfony(2.7)和学说的新手,并有以下问题/问题:

在我的自我项目中,我为支付系统创建了一个关系数据库。在这个数据库中,我有一个名为“company”的表和一个名为“account”的表。公司表包含用户数据,帐户表保留公司帐户的当前余额。这里是表的结构(用mysql):

帐户:
table account

公司:
id(主键,自动增量,int)
其他细节

表之间的关系是1:1。一个copmany有一个帐户。公司ID是帐户表中的外键,并引用公司表中的id。

创建此表后,我生成docrtrine orm xmls:

 php app/console doctrine:mapping:import FrontBundle

生成实体:

php app/console generate:doctrine:entities FrontBundle

生成doctrine orm xmls后,帐户表的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-     mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
 <entity name="FrontBundle\Entity\PaymentAccounts" table="payment__accounts">
  <unique-constraints>
    <unique-constraint name="company_id" columns="company_id"/>
  </unique-constraints>
  <id name="accountId" type="integer" column="account_id">
    <generator strategy="IDENTITY"/>
  </id>
  <field name="currentBalance" type="decimal" column="current_balance" precision="10" scale="2" nullable="false">
    <options>
      <option name="default">0.00</option>
    </options>
  </field>
  <field name="accountCreateDate" type="datetime" column="account_create_date" nullable="false">
    <options>
      <option name="default">CURRENT_TIMESTAMP</option>
    </options>
  </field>
  <many-to-one field="company" target-entity="UgCompany" fetch="LAZY">
    <join-columns>
      <join-column name="company_id" referenced-column-name="id"/>
    </join-columns>
  </many-to-one>
 </entity>
</doctrine-mapping>

我的第一个问题:为什么教义/ symfony会自动产生多对一的关系?如何将其更改为一对一?

生成实体后,帐户表的实体:

namespace FrontBundle\Entity;

/**
* PaymentAccounts
*/
class PaymentAccounts {

/**
 * @var string
 */
private $currentBalance = '0.00';

/**
 * @var \DateTime
 */
private $accountCreateDate = 'CURRENT_TIMESTAMP';

/**
 * @var integer
 */
private $accountId;

/**
 * @var \FrontBundle\Entity\UgCompany
 */
private $company;


/**
 * Set currentBalance
 *
 * @param string $currentBalance
 *
 * @return PaymentAccounts
 */
public function setCurrentBalance($currentBalance)
{
    $this->currentBalance = $currentBalance;

    return $this;
}

/**
 * Get currentBalance
 *
 * @return string
 */
public function getCurrentBalance()
{
    return $this->currentBalance;
}

/**
 * Set accountCreateDate
 *
 * @param \DateTime $accountCreateDate
 *
 * @return PaymentAccounts
 */
public function setAccountCreateDate($accountCreateDate)
{
    $this->accountCreateDate = $accountCreateDate;

    return $this;
}

/**
 * Get accountCreateDate
 *
 * @return \DateTime
 */
public function getAccountCreateDate()
{
    return $this->accountCreateDate;
}

/**
 * Get accountId
 *
 * @return integer
 */
public function getAccountId()
{
    return $this->accountId;
}

/**
 * Set company
 *
 * @param \FrontBundle\Entity\UgCompany $company
 *
 * @return PaymentAccounts
 */
public function setCompany(\FrontBundle\Entity\UgCompany $company = null)
{
    $this->company = $company;

    return $this;
}

/**
 * Get company
 *
 * @return \FrontBundle\Entity\UgCompany
 */
public function getCompany()
{
    return $this->company;
}
}

第二个问题:为什么会产生公司实体而不是company_od?

如果我在帐户表中添加一行并尝试从表中获取记录,我的浏览器会加载并加载和填充...然后我的浏览器冻结..

 public function getAllAccounts() {
    $accounts = $this->getDoctrine()->getManager()->getRepository('FrontBundle:PaymentAccounts')->createQueryBuilder("C")
        ->select()
        ->getQuery()
        ->getResult();
    return $accounts;
}

问题如下我试图描述: 我试图打印查询的结果数组,并看到查询尝试加载所有comapnies而不是我需要的公司数据。我得到一个包含account_id,current_balance,current_timestamp的数组,至少是一个包含公司表中所有公司数组的数组(公司表有4500-5000行/条目)。但我只希望公司的信息与给定的company_id ..而不是所有公司..

这是多对一关系的问题吗?或者这是我的查询的问题?也许我创建了一个错误的mysql数据库?我希望得到有用的答案。

1 个答案:

答案 0 :(得分:0)

你整个过程有点不对劲。

1)如果您的开发和生产环境包含2个独立的数据库,我建议您使用doctrine迁移。请阅读它。

2)创建表然后生成映射是错误的。如果要从现有数据库中获取模式,可以使用此功能。

3)您的浏览器冻结,因为您正在尝试使用默认功能打印一堆对象。请使用symfony Var dumpers dump()函数来调试对象。如果默认打印而不使用dump(),它们包含一堆信息。

关于流程,我建议你这样做。

//使用注释!

1)您使用doctrine:generate:entity,您可以指定所有需要的字段 - 除了关系。

2)自己写下你的关系。

3)如果您正在使用学说迁移 - doctrine:migrations:diff和doctrine:migration:execute --version

4)如果没有,那么doctrine:schema:update

关于上次描述的问题。

我没有完全理解,但如果你选择了所有公司,那么你就会得到所有公司。如果你想选择一个,那么使用where ...

PS。我强烈建议您使用doctrine migrations bundle并阅读https://symfony.com/doc/3.3/doctrine.html