Startseite
NexoPOS

Modelabhängigkeit definieren

Die Modellabhängigkeit stellt sicher, dass ein Modell nicht gelöscht werden kann, solange es noch als Referenz in einem anderen Modell verwendet wird. Beispielsweise kann ein Kunde nicht gelöscht werden, wenn er noch mit einer Bestellung verknüpft ist, und ein Produkt kann nicht gelöscht werden, wenn es noch mit einem Bestellprodukt verknüpft ist.

Diese Funktion trägt dazu bei, die Integrität Ihrer Daten zu schützen, indem sie die ordnungsgemäße Löschung von Einträgen erzwingt, um verwaiste und ausgeblendete Einträge zu vermeiden.

Abhängigkeitserklärung

Die Abhängigkeit wird standardmäßig für jedes Modell erstellt. Du verwendest die Eigenschaft „setDependencies“, wobei du ein Array angibst, das die zugehörige Klasse als Schlüssel enthält, sowie ein weiteres Array, um die Konfiguration festzulegen. Hier ist ein Beispiel.

<?php
namespace Modules\YourModules\Models;

use App\Models\NsModel;
use App\Classes\Model;

class Book extends NsModel
{
    public function setDepedencies() {
        return [
            BookChapter::class => Model::dependant(
                local_index: 'id', // the index on Book that will be used as reference
                local_name: 'name', // the attribute that will be used to display the error. e.g "a Storm of Sword cannot be deleted..."
                foreign_index: 'id', // is the relation attribute on the BookChapter class
                foreign_name: 'name', // as for the book, this attribute will be used on the error. e.g "a Storm of Sword cannot be deleted as it's used by Chapter 1"
            )
        ];
    }
}

Verwendung der zugehörigen Tabelle als Referenz

Manchmal möchten Sie Ihre Abhängigkeit mit einer anderen, verwandten Tabelle verknüpfen. Betrachten wir das folgende Szenario: Sie haben ein Rezept, das Produkte als Zutaten verwendet. Dafür gibt es hier eine Vermittlertabelle, die die Produkte mit den Rezept-Zutatentabellen verknüpft. Typischerweise hat diese Vermittlertabelle kein Attribut „name“; daher verwenden wir den Namen der zugehörigen Tabelle.

Hier ist eine detaillierte Struktur für dieses Beispiel.

Products
-> name: "Tomato"
-> id: 2

Recipe
->name "Hot Tomato"
->id 1

Ingredient
-> product_id: 2
-> recipe_id: 1

Hier müssen wir eine Möglichkeit schaffen, das Löschen von Produkten zu verhindern, wenn sie als Zutaten verwendet werden, und wir müssen den Rezeptnamen verwenden, um eine Fehlermeldung anzuzeigen, wie zum Beispiel: „Tomate kann nicht gelöscht werden, da sie eine Abhängigkeit für Hot Tomato ist.“

<?php
namespace Modules\YourModule\Models;

use App\Models\NsModel;
use App\Classes\Model;

class Product extends NsMoels
{
    public function setDependencies()
    {
        return [
            Ingredient::class => Model::dependant(
                local_name: 'name', // local attribute to be used for the error on the Product table
                foreign_index: 'product_id', // the attribute on the Ingredient table, which is the middleman table
                related: Model::related( // we define the attribute here
                    model: Recipe::class, // we link the related model Recipe
                    local_name: 'name', // the attribute to be used for the error.
                    local_index: 'id', // the foreign attribute on Recipe. The value is by default "id"
                    foreign_index: 'recipe_id', // the local attribute on Ingredient                
                )
            );
        ];
    }
}

Präfix für den Abhängigkeitsnamen

Der bisher ausgelöste Fehler zieht den Namen der Elemente und zeigt ihn als abhängig an. Möglicherweise möchten Sie diesem Namen jedoch einen Kontext geben. In unserem vorherigen Beispiel wäre es doch schön, wenn wir statt „Hot Tomato“ „Rezept: Hot Tomato“ verwenden könnten. Genau dafür wird das „Präfix“ in der zugehörigen Methode verwendet.

Du definierst ein benanntes Argument „prefix“ für eine Callback-Funktion, die den Namen des abhängigen Modells als Parameter verwendet. Von dort aus kannst du jede andere lokalisierte Zeichenkette mithilfe dieses Namens zurückgeben.

Erweiterung der Abhängigkeit von einem anderen Modell

Du bist nicht gezwungen, nur eine Abhängigkeit für dein Modell bereitzustellen, sondern du kannst auch eine benutzerdefinierte Abhängigkeit zu anderen Modellen angeben. Beispielsweise kann ein Benutzer nicht gelöscht werden, wenn er noch ein Buch hat, das er in das System eingegeben hat.

Dazu werden wir in unserem Modul diese Abhängigkeit wie folgt registrieren:

<?php
namespace Modules\YourModule\Providers;

use Illuminate\Support\Provider as CoreProvider;
use App\Classes\Hook;
use App\Classes\Model;
use App\Models\User;
use Modules\YourModule\Models\Book;

class ServiceProvider extends CoreProvider
{
    public function register()
    {
        Hook::filter( User::method( 'setDependencies' ), function( $dependants ) {
            $dependants[ Book::class ]  =   Model::dependant(
                local_index: 'id',
                local_name: 'name',
                foreign_index: 'user_id',
                foreign_name: 'name'
            );
            
            return $dependants;
        });
    }
}