Zum Ende der Metadaten springen
Zum Anfang der Metadaten

Sie zeigen eine alte Version dieser Seite an. Zeigen Sie die aktuelle Version an.

Unterschiede anzeigen Seitenhistorie anzeigen

Version 1 Nächste Version anzeigen »

Das Paket ComplexQuery stellt Funktionen zur Verfügung, die es ermöglichen mit Doctrine wirtschaftlich und komplex zu arbeiten.

Erstellen eines Query

Um einen Query zu erstellen, verwenden wir den Doctrine QueryBuilder. Er wird vom ComplexQuery\Builder instanziiert und bereitgestellt:

use Brandbox\Framework\Brandbox\ComplexQuery;

$groupArticleBuilder = new Demo\Lib\ComplexQuery\GroupArticleBuilder();

$builder = new ComplexQuery\Builder();
$result = $builder->getIterable($groupArticleBuilder); 

Für jeden Query für zu diesem Zweck ein eigener Builder erstellt, der den eigentlichen Query für den jeweiligen Fall beinhaltet:

use Brandbox\Framework\Brandbox\ComplexQuery;

use Brandbox\ShopCore\Shop\Group;
use Brandbox\ShopCore\Shop\Article;

class GroupArticleBuilder
    extends ComplexQuery\BuilderAbstract
    implements ComplexQuery\BuilderInterface
{

    public function build(): void
    {
        $this
            ->select(
                CQDemo\Lib\Dto\GroupArticle::class,
                [
                    'shopGroup.shopGroupName',
                    'shopArticle.shopArticleName'
                ]
            )
            ->from(Group\lib\entity\shopGroup::class)
            ->joinRelation(Group\lib\entity\shopGroup::class, Article\lib\entity\shopArticle::class)
            ->joinTranslation(
                Article\lib\entity\shopArticle::class,
                Article\lib\entity\translationShopArticle::class,
                $collationId = 2
            )
            ->andWhere('translationShopArticle.shopArticleName != \'\'')
            ->andWhere('shopArticle.shopArticleName LIKE :name')
            ->orderAsc('shopGroup.shopGroupName')
            ->orderDesc('shopArticle.shopArticleName')
            ->noCacheable()
            ->setFirstResult(0)
            ->setMaxResults(3)
            ->setParameter('name', '%Craft%')
        ;
    }
}

Das vorherige Beispiel zeigt einige konkrete Anwendungsfälle, die nachfolgend beschrieben werden.

Verwenden von DTOs

In der SELECT-Anweisung des Builder wird ein DTO referenziert. Der Konstruktur des DTO erwartet zwei Parameter, die dort im zweiten Parameter definiert werden.

use Brandbox\Attributes\TableIndex;

use Brandbox\ShopCore\Shop\Article;

#[TableIndex(
    entityClass: Article\lib\entity\shopArticle::class,
    columns: ['shop_article_name'],
    name: 'dtoGroupArticle')
]
readonly class GroupArticle
{
    public function __construct(
        public ?string $groupName = null,
        public ?string $articleName = null
    ) {
    }
}

Joins von Relations

Das DTO enthält zwei Informationen aus je einer Tabelle. Es ist hier also sehr einfach möglich zwischen zwei Tabellen zu Joinen und die Inhalte zusammenzuführen. Dabei ist zu beachten, dass die beiden Datentypen auch tatsächlich als Relation existieren.

Joins von Translations

Das Gleiche gilt für Übersetzungen. Im oben gezeigten Beispiel werden Übersetzungen des Artikel bezogen, die dann aber nicht weiter verarbeitet werden.

Iterable

Im Gegensatz zur Methode getResult() verarbeitet getIterable() die Inhalte Zeilenweise. Das hat sehr deutliche Auswirkungen auf die Performance und den Ressourcenbedarf zur Laufzeit (CPU/RAM).

Individuelle Indizes

Es kann nun der Fall eintreten, dass man für den jeweiligen Query einen bzw. mehrere eigenständige(n) SQL-Index/-Indizes benötigt. Die Indizes können direkt beim DTO ergänzt werden.

Mandanten, Rollen und Rechte

Um diese Ebenen muss man sich auch hier nicht aktiv kümmern. Mandanten, Rollen und Rechte werden in der FROM-Anweisung verarbeitet. Dort ist es möglich anzugeben, ob die jeweiligen Daten verarbeitet werden sollen.

  • Keine Stichwörter