Définir la dépendance des modèles
La dépendance du 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 toujours associé à une commande, et un produit ne peut pas être supprimé s’il est toujours associé à un produit de commande.
Cette fonctionnalité tend à préserver l’intégrité de vos données en imposant la suppression correcte des entrées afin d’éviter les entrées orphelines et masquées.
Déclaration de dépendance
La dépendance est créée par défaut sur chaque modèle. Vous utiliserez la propriété « setDependencies », dans laquelle vous fournirez un tableau avec la classe associée comme clé et un autre tableau pour configurer la configuration. Voici un exemple.
<?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"
)
];
}
}
Utiliser le tableau associé comme référence
Parfois, vous souhaitez lier votre dépendance à une autre table associée. Prenons le scénario suivant. Vous avez une recette qui utilise des produits comme ingrédients. Nous disposons ici d’une table intermédiaire qui relie les produits aux tables d’ingrédients de la recette. En général, cette table intermédiaire ne possède aucun attribut « nom » ; par conséquent, nous utiliserons le nom de la table associée.
Voici une structure détaillée pour cet exemple.
Products
-> name: "Tomato"
-> id: 2
Recipe
->name "Hot Tomato"
->id 1
Ingredient
-> product_id: 2
-> recipe_id: 1
Ici, nous devons créer un moyen d’empêcher la suppression des Produits s’ils sont utilisés comme Ingrédients, et nous devons utiliser le nom de la Recette pour afficher une erreur du type : « La tomate ne peut pas être supprimée car elle est une dépendance pour la recette Tomate chaude ».
<?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éfixe pour le nom de la dépendance
L’erreur levée jusqu’à présent extrait le nom des éléments et l’affiche comme étant dépendant. Cependant, vous pourriez vouloir donner un contexte à ce nom. Dans notre exemple précédent, ne serait-il pas agréable que, au lieu de « Hot Tomato », on puisse utiliser « Recette : Hot Tomato » ? C’est là qu’intervient le « préfixe » sur la méthode associée.
Vous définirez un argument nommé « prefix » pour une fonction de rappel qui utilise le nom du modèle dépendant comme paramètre. À partir de là, vous pouvez renvoyer toute autre chaîne localisée en utilisant ce nom.
Extension de la dépendance à un autre modèle
Vous n’êtes pas obligé de fournir uniquement une dépendance pour votre modèle, mais vous pouvez fournir une dépendance personnalisée à d’autres modèles. Par exemple, un utilisateur ne peut pas être supprimé s’il possède encore un livre qu’il a saisi dans le système.
Pour cela, dans notre module, nous enregistrerons cette dépendance comme suit :
<?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;
});
}
}