我是symfony(2.7)和学说的新手,并有以下问题/问题:
在我的自我项目中,我为支付系统创建了一个关系数据库。在这个数据库中,我有一个名为“company”的表和一个名为“account”的表。公司表包含用户数据,帐户表保留公司帐户的当前余额。这里是表的结构(用mysql):
帐户:
table account
表之间的关系是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数据库?我希望得到有用的答案。
答案 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