Definisci la dipendenza dei modelli
La dépendance au modèle garantit qu’un modèle ne peut pas être supprimé s’il est encore utilisé comme référence dans un autre modèle. Par exemple, un client ne peut pas être supprimé s’il est encore associé à une commande, et un produit ne peut pas être supprimé s’il est encore associé à un produit de commande.
Questa funzionalità tende a proteggere l’integrità dei tuoi dati imponendo la cancellazione corretta delle voci per evitare voci orfane e nascoste.
Dichiarazione della dipendenza
La dipendenza viene creata automaticamente per ogni modello. Userai la proprietà "setDependencies", in cui fornirai un array con la classe correlata come chiave e un altro array per configurare la configurazione. Ecco un esempio.
<?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"
)
];
}
}
Usando la tabella correlata come riferimento
Parfois, vous souhaitez lier votre dépendance à une autre table associée. Prenons le scénario suivant. Vous disposez d’une recette qui utilise des produits comme ingrédients. Nous avons ici une table d’intermédiaire qui relie les produits aux tables d’ingrédients de la recette. En général, cette table d’intermédiaire ne possède aucun attribut « nom » ; par conséquent, nous utiliserons le nom de la table associée.
Ecco una struttura dettagliata per questo esempio.
Products
-> name: "Tomato"
-> id: 2
Recipe
->name "Hot Tomato"
->id 1
Ingredient
-> product_id: 2
-> recipe_id: 1
Qui dobbiamo creare un modo per impedire l’eliminazione dei Prodotti se vengono utilizzati come Ingredienti e dobbiamo usare il nome della Ricetta per visualizzare un errore come: "Il pomodoro non può essere eliminato perché è una dipendenza per il Pomodoro caldo".
<?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
)
);
];
}
}
Prefisso per il nome della dipendenza
L’errore finora generato estrae il nome degli elementi e lo visualizza come dipendente. Tuttavia, potresti voler fornire un contesto a quel nome. Nel nostro esempio precedente, non sarebbe bello se invece di “Hot Tomato” potessimo usare “Ricetta: Hot Tomato”? È qui che viene usato il “prefisso” nel metodo correlato.
Definirai un argomento con nome "prefix" per una funzione di callback che utilizza il nome del modello dipendente come parametro. Da lì, puoi restituire qualsiasi altra stringa localizzata usando quel nome.
Estensione della dipendenza da altri modelli
Non sei obbligato a fornire solo una dipendenza per il tuo modello, ma puoi fornire una dipendenza personalizzata ad altri modelli. Ad esempio, un utente non può essere eliminato se ha ancora un libro che ha inserito nel sistema.
A tal fine, nel nostro modulo registreremo questa dipendenza nel seguente modo:
<?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;
});
}
}