Hubert

Model

Bevor man mit den Models beginnt, muss man die DB-Extension per Composer laden:

{
    "require": {
        "falkm/hubert-db": "1.*"
    }
}

Anschließend legen wir eine config/database.global.php Datei an:

<?php
return array(
    "factories" => array(
        "dbAdapter" => array(hubert\extension\db\factory::class, 'get')
    ), 
    "config" => array(
        "db" => array(
            'driver'   => 'Pdo_Mysql',
            'database' => 'db_test',
            'username' => 'user',
            'password' => 'pass',
        ),
    )
);

Weitere Infos zur Konfiguration findest du unter docs.zendframework.com/zend-db

Model definieren

Für unser Beispiel legen wir in der Datei src/model/user.php ein Model "user" an:

<?php

namespace src\model;

class user extends \hubert\extension\db\model {

    protected static $table = "user";

    public static function fields(){
        return array(
            "id" => array('type' => 'int(11)', 'primary' => true, 'autoincrement' => true),
            "login_name" => array('type' => 'varchar(30)', "default" => ""),
            "password" => array('type' => 'varchar(50)'),
            "comment" => array('type' => 'text', 'null' => true),
        );
    }

    public function getRoleIds(){
        $role_ids = array(1);
        $query = "SELECT role_id FROM user_role_mapping WHERE user_id = :user_id";
        $result = hubert()->dbAdapter->query($query, array("user_id" => $this->id));
        foreach ($result as $res){
            $role_ids[] = $res["role_id"];
        }
        return $role_ids;
    }

}

Models müssen von \hubert\extension\db\model erben. Des Weiteren muss in einer statischen Variable $table die Datenbanktabelle zum Model und in einer statischen Funktion fields() die Felder dieser Tabelle definiert werden.

Die Funktion fields() muss einen Array zurückgeben, bei dem die namen der Elemente den Namen der Datenbank-Felder entsprechen und als Wert einen Array mit der Configuration des Feldes.
Möglich optionen sind:

Tabellen anlegen

$factory = new \hubert\extension\db\factory();
$factory->createTableByModel(\src\model\user::class);

Die Funktion createTableByModel($modelClass) der Klasse "factory" erstellt eine DatenbankTabelle anhand der Feld-Definition eines Modells. Sollte die Tabelle schon existieren, werden die Felder abgeglichen und Felder angelegt, welche im Modell definiert sind, aber nicht in der Tabelle existieren.

Arbeiten mit Models

$user = src\model\user::selectOne(["id" => 1]);
$user->name = "hubert";
$user->update(["name]);
print_r($user->getRoleIds());

$new_user = new src\model\user();
$new_user->name = "hubert2";
$new_user->password = "test";
$new_user->insert();
echo "new Users Id: ".$new_user->id;

$all_users = src\model\user::selectAll();
print_r(json_encode($all_users));

Dadurch, dass Models von \hubert\extension\db\model erben, stehen die statischen Funktionen selectOne($where) und selectAll($where, $limit = 0, $offset = 0) zur Verfügung. Im Beispiel wurde noch ein getRoleIds()-Funktion definiert, um bestimmte Werte aus einer anderen Tabelle ab zu rufen. Des weiteren stehen die Funtion insert() zum einfügen und update($rows = array()) zum Update eines Models zur verfügung. bei der Update-Funktion kann optional auch ein Array mit Spalten-Namen übergeben werden, wenn man nicht alle Spalten des Models updaten möchte.