Почему Doctrine автоматически генерирует отношения n: 1? Почему я получаю все сущности таблицы с внешним ключом вместо одной строки? - PullRequest
0 голосов
/ 29 апреля 2018

Я новичок в Symfony (2.7) и доктрине и имею следующие вопросы / проблемы:

В своем собственном проекте я создал реляционную базу данных для платежной системы. В этой базе данных у меня есть таблица с названием «company» и таблица с именем «account». Таблица компании содержит данные пользователя, а таблица счетов сохраняет текущий баланс счета компании. Вот структура таблиц (с mysql):

аккаунт:
таблица счетов

компания:
id (первичный ключ, автоинкремент, int)
другие детали

Между таблицами есть соотношение 1: 1. Один человек имеет один аккаунт. Идентификатор компании - это внешний ключ в таблице счетов и ссылки на идентификатор в таблице компаний.

После создания этих таблиц я генерирую docrtrine orm xmls с:

 php app/console doctrine:mapping:import FrontBundle

И генерировать сущности с помощью:

php app/console generate:doctrine:entities FrontBundle

После создания доктрины 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;
}

Проблема заключается в следующем, что я пытался описать: Я попытался напечатать массив результатов запроса и увидел, что запрос пытается загрузить все компании вместо данных одной компании, которые мне нужны. Я получаю массив с account_id, current_balance, current_timestamp и, по крайней мере, массив с массивами всех компаний, которые находятся в таблице компании (таблицы компании имеют 4500-5000 строк / записей). Но я хочу только информацию о компании с данным company_id .. и не все компании ..

Это проблема с отношением многие-к-одному? или это проблема с моим запросом? возможно я создаю неправильную базу данных mysql? надеюсь на полезные ответы.

1 Ответ

0 голосов
/ 29 апреля 2018

Вы делаете весь процесс немного неправильно.

1) Я предлагаю вам использовать доктрину миграции, если у вас будет среда разработки и производства с 2 отдельными базами данных. Пожалуйста, прочитайте об этом.

2) Неправильно создавать таблицы, а затем создавать сопоставления. Вы можете использовать эту функцию, когда хотите получить схему из существующей базы данных.

3) Ваш браузер зависает, потому что вы пытаетесь напечатать группу объектов с функциями по умолчанию. Пожалуйста, используйте функцию symfony Var dumpers dump () для отладки объектов. Они содержат кучу информации, если распечатаны по умолчанию без использования dump ().

А насчет процесса, я предлагаю вам это.

// Использовать аннотации!

1) Вы используете doctrine: generate: entity и можете указать все необходимые поля - кроме отношений.

2) Напишите свои отношения самостоятельно.

3) Если вы используете миграции доктрин - доктрина: миграции: различия и доктрина: миграция: выполнение - версия

4) Если нет, то доктрина: схема: обновление

О последней описанной проблеме.

Я не совсем понял, но если вы выбрали все компании, то вы получите все компании. Если вы хотите выбрать один из них, используйте где ...

пс. Я настоятельно рекомендую вам использовать комплект миграции доктрин и читать https://symfony.com/doc/3.3/doctrine.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...