# Eigenes Model / Datenbanktabelle

**URL:** <https://forum.oxid-esales.com/t/eigenes-model-datenbanktabelle/97406>\
**Category:** Deutsches Forum\
**Tags:** module, development, datenbank\
**Created:** [December 10, 2020, 10:02am UTC](https://forum.oxid-esales.com/t/eigenes-model-datenbanktabelle/97406 "2020-12-10T10:02:12Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![drazen](https://forum.oxid-esales.com/letter_avatar_proxy/v4/letter/d/6a8cbe/32.png) [@drazen](https://forum.oxid-esales.com/u/drazen)\
**Post date:** [December 10, 2020, 10:02am UTC](https://forum.oxid-esales.com/t/eigenes-model-datenbanktabelle/97406/1 "2020-12-10T10:02:12Z")

</div>

Hallo an Alle!

Ich versuche gerade in unserem Modul eine neue Datenbanktabelle für Shipping Labels anzulegen. Bin dabei auf folgende Problematik gestoßen:

1. `DatabseProvider` ist deprecated. Man soll das `QueryBuilderInterface` nutzen. Alles gut, jedoch kann der QueryBuilder keine neuen Datenbanktabellen erstellen, oder irre ich mich? Wie erstelle ich dann eine neue Datenbanktabelle?

2. Ich hätte gern ein eigenes, Custom, Model für die Datenbanktabelle. Muss ich hierfür die `\OxidEsales\Eshop\Core\Model\BaseModel` Klasse extenden? Muss ich sonst noch was tun damit mein Model vom System erkannt wird und mit `oxNew()` verwendet werden kann?

Entschuldigt bitte falls die Fragen bereits irgendwo gestellt/beantwortet wurden. Ich konnte bisher noch nichts finden.

---

<div class="post-metadata">

**Author:** ![marco.steinhaeuser](https://forum.oxid-esales.com/user_avatar/forum.oxid-esales.com/marco.steinhaeuser/32/1832_2.png) [@marco.steinhaeuser](https://forum.oxid-esales.com/u/marco.steinhaeuser)\
**Post date:** [December 10, 2020, 10:14am UTC](https://forum.oxid-esales.com/t/eigenes-model-datenbanktabelle/97406/2 "2020-12-10T10:14:36Z")

</div>

Puh, hoffentlich lehne ich mich jetzt nicht zu weit aus dem Fenster…  
Das hier habe ich für Dich gefunden: [https://docs.oxid-esales.com/developer/en/6.2/development/modules\_components\_themes/module/using\_database.html](https://docs.oxid-esales.com/developer/en/6.2/development/modules_components_themes/module/using_database.html). Und wenn ich das richtig sehe, kann man mit `insert($tableName)` auch eine DB-Tabelle anlegen: [https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/query-builder.html](https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/query-builder.html)

---

<div class="post-metadata">

**Author:** ![drazen](https://forum.oxid-esales.com/letter_avatar_proxy/v4/letter/d/6a8cbe/32.png) [@drazen](https://forum.oxid-esales.com/u/drazen)\
**Post date:** [December 10, 2020, 11:15am UTC](https://forum.oxid-esales.com/t/eigenes-model-datenbanktabelle/97406/3 "2020-12-10T11:15:22Z")

</div>

@marco.steinhaeuser danke für die schnelle Antwort!

Die von Dir angegebenen Links habe ich auch schon gefunden. Ich habe es auch soeben ausprobiert, leider geht das nicht. Es macht ja auch Sinn, da die `insert()` Methode ja nur für das Einfügen der Daten in eine bestehende Datenbanktabelle gedacht ist.

`An exception occurred while executing 'INSERT INTO shipping_labels () VALUES()': SQLSTATE[42S02]: Base table or view not found: 1146 Table 'oxid.shipping_labels' doesn't exist`

Soll ich dann einfach die Deprecated Methode nutzen? Ich sehe zurzeit keine andere Möglichkeit.

EDIT: Die Model-Klasse funktioniert super. Ich müsste jetzt nur noch die Datenbanktabelle richtig erstellen.

---

<div class="post-metadata">

**Author:** ![indianer3c](https://forum.oxid-esales.com/user_avatar/forum.oxid-esales.com/indianer3c/32/4325_2.png) [@indianer3c](https://forum.oxid-esales.com/u/indianer3c)\
**Post date:** [December 10, 2020, 11:35am UTC](https://forum.oxid-esales.com/t/eigenes-model-datenbanktabelle/97406/4 "2020-12-10T11:35:09Z")

</div>

> [@drazen](#):
>
> `DatabseProvider` ist deprecated. Man soll das `QueryBuilderInterface` nutzen. Alles gut, jedoch kann der QueryBuilder keine neuen Datenbanktabellen erstellen, oder irre ich mich? Wie erstelle ich dann eine neue Datenbanktabelle?

Die Doctrine Dokumentation Schema unter [Schema-Manager - Doctrine Database Abstraction Layer (DBAL)](https://www.doctrine-project.org/projects/doctrine-dbal/en/2.10/reference/schema-manager.html#createschema) sollte der Weg sein. In der Dokumentation selber sieht man nur `dropTable()` erwähnt, aber wenn man sich den PHP Code anguckt gibt es auch `createTable()`

Wenn man sich an Doctrine orientieren möchte könnten man folgendes Beispiel probieren

```
use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory;
use OxidEsales\EshopCommunity\Internal\Framework\Database\QueryBuilderFactoryInterface;

$container = ContainerFactory::getInstance()->getContainer();
$queryBuilderFactory = $container->get(QueryBuilderFactoryInterface::class);
$schemaManager = $queryBuilderFactory->getSchemaManager;
$schemaManager->createTable('shipping_labels');
$schemaManager->addColumn('name', 'string');

```

> [@drazen](#):
>
> Ich hätte gern ein eigenes, Custom, Model für die Datenbanktabelle. Muss ich hierfür die `\OxidEsales\Eshop\Core\Model\BaseModel` Klasse extenden?

Ja, wenn Du auf OXID Framework Funktionalitäten zurückgreifen möchtest.

Nein, wenn Du OXID Framework Funktionalitäten nicht benötigst und es lieber selbst managen möchtest.

> [@drazen](#):
>
> Muss ich sonst noch was tun damit mein Model vom System erkannt wird und mit `oxNew()` verwendet werden kann?

Nein, Models im Modul werden vom OXID Framework normalerweise von selbst erkannt. Dies wirst aber merken ob `oxNew()` fehlschlägt mit Deinem Model oder nicht.

---

<div class="post-metadata">

**Author:** ![drazen](https://forum.oxid-esales.com/letter_avatar_proxy/v4/letter/d/6a8cbe/32.png) [@drazen](https://forum.oxid-esales.com/u/drazen)\
**Post date:** [December 10, 2020, 11:54am UTC](https://forum.oxid-esales.com/t/eigenes-model-datenbanktabelle/97406/5 "2020-12-10T11:54:14Z")

</div>

@indianer3c

Danke für die Hilfe! Leider funktioniert der `getSchemaManager()` Aufruf auf der `$queryBuilderFactory` nicht. Die Methode gibt es dort nicht:

`Uncaught Error: Call to undefined method OxidEsales\EshopCommunity\Internal\Framework\Database\QueryBuilderFactory::getSchemaManager()`

Das mit der Model-Klasse habe ich mittlerweile hinbekommen. Die Datenbanktabelle kann ich auch erstellen, halt nur mit der deprecated `DatabaseProvider` Klasse:

```php
$db = \OxidEsales\Eshop\Core\DatabaseProvider\DatabaseProvider::getDb();
$db->execute("CREATE TABLE IF NOT EXISTS ...");

```

Funktioniert auch super, jedoch hätte ich es gerne richtig gemacht, und nicht mit einer Klasse die demnächst entfernt wird.

---

<div class="post-metadata">

**Author:** ![vanilla\_thunder](https://forum.oxid-esales.com/user_avatar/forum.oxid-esales.com/vanilla_thunder/32/72_2.png) [@vanilla\_thunder](https://forum.oxid-esales.com/u/vanilla_thunder)\
**Post date:** [December 10, 2020, 12:33pm UTC](https://forum.oxid-esales.com/t/eigenes-model-datenbanktabelle/97406/6 "2020-12-10T12:33:53Z")

</div>

das Problem hatte ich auch kürzlich, habe mich für den MetadataHändler entschieden.  
Hier einer meiner onActivate Events:

```auto
/** @var \OxidEsales\Eshop\Core\DbMetaDataHandler $dbMetaDataHandler */
$dbMetaDataHandler = oxNew(\OxidEsales\Eshop\Core\DbMetaDataHandler::class);

$aQueries = [];

if (!$dbMetaDataHandler->fieldExists("my_column","tablename"))
{
    $aQueries[] = "ALTER TABLE `tablename` ADD `my_column` INT( 11 ) UNSIGNED NULL;";
}

if (!$dbMetaDataHandler->tableExists("meine_tabelle"))
{
    $aQueries[] = "CREATE TABLE `meine_tabelle` ( "
               ." `CustomerNo` int(11) NOT NULL COMMENT 'Customer Number', "
               ." `ItemNo` varchar(16) NOT NULL COMMENT 'Item Number', "
               ." `Price` double NOT NULL COMMENT 'netto price', "
               ." `PriceVAT` double NOT NULL COMMENT 'brutto price', "
               ." `CurrencyCode` varchar(3) NOT NULL COMMENT 'currency code', "
               ." `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'timestamp for caching' "
               ." ) ENGINE=InnoDB DEFAULT CHARSET=latin1;";
    $aQueries[] = "ALTER TABLE `meine_tabelle` ADD PRIMARY KEY (`CustomerNo`, `ItemNo`);";
}

if(count($aQueries) === 0) return true;

$dbMetaDataHandler->executeSql($aQueries);
$dbMetaDataHandler->updateViews();

```

---

<div class="post-metadata">

**Author:** ![system](https://forum.oxid-esales.com/user_avatar/forum.oxid-esales.com/system/32/4245_2.png) [@system](https://forum.oxid-esales.com/u/system)\
**Post date:** [December 10, 2021, 12:33pm UTC](https://forum.oxid-esales.com/t/eigenes-model-datenbanktabelle/97406/7 "2021-12-10T12:33:55Z")

</div>

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.
