Nano Hash - криптовалюты, майнинг, программирование

Имя динамической таблицы Doctrine2 для объекта

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

Я прочитал этот пост [Имена динамических таблиц/сущностей в Doctrine 2][1] [1]: Динамические имена таблиц/сущностей в Doctrine 2 и это о слушателе доктрины [слушатель доктрины][2] [2] : http://doctrine-orm.readthedocs.org/en/latest/reference/events.html

Итак, вот как я пытаюсь это сделать:

Я создал объект с подстановочным знаком в имени таблицы:

<?php

namespace DD\MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * SiteElec
 *
 * @ORM\Table(name="site_x_elec")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 * @ORM\EntityListeners({"DD\MyBundle\Entity\Listener\SiteElecListener"})
 */
class SiteElec
{
    I skip properties with getters and setters

}

Затем я сделал прослушиватель для этого объекта:

<?php

namespace DD\MyBundle\Entity\Listener;

use DD\UserBundle\Entit\User;
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

/**
 * Listener pour l'entité siteElec.
 */
class SiteElecListener {


private $_tableName = null;
protected $token_storage;
protected $user;

public function getTableName() {
    return $this->_tableName;
}

public function setTableName($tableName) {
    $this->_tableName = $tableName;
    return $this;
}

public function __construct(TokenStorageInterface $token_storage) {

    $this->token_storage = $token_storage;

    if($token_storage->getToken() != null){

    }
}

/*
 * @ORM\LoadClassMetadata
 * @param LoadClassMetadataEventArgs $eventArgs
 */
public function loadClassMetadata(LoadClassMetadataEventArgs $args) {

    //$this->user = $this->token_storage->getToken();
    //var_dump($this->token_storage);

    $classMetadata = $args->getClassMetadata();
    $table = $classMetadata->table;
        var_dump($classMetadata);
//        $table['name'] = 'site_'.$this->user->getSite()->getId().'_elec';
//        $classMetadata->setPrimaryTable($table);
}

}

Затем я объявляю своего слушателя в файле конфигурации:

    dd.entity_listener.site_elec:
    class:      DD\MyBundle\Entity\Listener\SiteElecListener
    arguments:  
        - "@security.token_storage"
    tags:
        - { name: doctrine.event_listener, event: loadClassMetadata }

Если я посмотрю на $classMetadata var, у меня будет только мой пользовательский объект и связанный объект, но не мой объект SiteElec.

Должно быть, я где-то ошибся, но не знаю где.

Есть идеи ? Спасибо


Ответы:


1

Таким образом, вы можете использовать динамическое имя таблицы для некоторых сущностей в Doctrine 2.

1) Установить таблицу (имя = "NULL") в объекте

<?php

namespace DD\MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * SiteElec
 *
 * @Table(name="NULL")
 * @ORM\Entity
 */
class SiteElec { ... }

2) Затем установите имя таблицы перед использованием объекта

$EM
  ->getClassMetadata('DD\MyBundle\Entity\SiteElec')
  ->setTableName($DYNAMIC_TABLE_NAME);

3) Используйте сущность с именем динамической таблицы, как обычно

$result = $EM
  ->getRepository('DD\MyBundle\Entity\SiteElec')
  ->findBy(['id' => $SOME_ID]);
12.04.2018
  • Это будет работать в среде разработки, но не будет работать в производстве. Кэш запросов также должен быть отключен для производственной среды. Я сделал это через: ``` lang-php $queryBuilderQuery = $queryBuilder-›getQuery(); $queryBuilderQuery-›expireQueryCache(); ``` 19.06.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..