Bonjour,
Je veux mettre en place un système de catégories très général sur mon site web. Que seulement les administrateur peut créer des catégories pour catégoriser un type de contenu. Que je peut avoir des catégories pour des articles, projets, musique etc.
Je me suis fait une table de categories très simple :
categories
La colone type c'est juste pour regrouper les catégories par type de contenu. (Articles, Projects, Music etc). Dans un model lorsque hje déclare la relation entre le model category et projet par exemple. J'ai une liste de tous les catégories qui on un type App\Project et non tous les categories de la table.
// relation projet -> category
public function category()
{
return $this->belongsTo(Category::class);
}
Naïvement j'ajouterais un champ category_id dans tous les table où je veux categorieser mes contenus d'une table en particlier. Je me suis rendu compte que je me perdait dans mon code. Je commençais avoir trop de problème d'organisation. Je fesais des test avec phpunit. J'avais de la dificulté à écrire mes testes. J'ai consulté la documentation de Laravel à propos de relation entre model :
https://laravel.com/docs/5.6/eloquent-relationships
Je pense que mon cas est que je devrais faire une table pevot :
categories
categorisable (Table pevot)
Je pense que faire une relation Polymorphic serais une bonne piste. Je pourrais utiliser le sysème sync disponible dans Laravel. Si je change le type d'une catégorie. Laravel peut faire la syncronisation.
Il y a un autre problème. Une category peut avoir plusieurs contenu, mais que les mondels (Post, Project etc) peuvent seulement avoir une categorie.
Merci de m'éclarer.
Bonjour,
dans ton cas si les modèles Post, Project... ne peuvent avoir qu'une seule catégorie, tu es dans un cas de relation belongsTo. Exemple pour le modèle Post.
public function category()
{
return $this->belongsTo(\App\Category::class);
}
Dans le modèle Category crée autant de méthodes que tu as besoin pour récupérer tes relations en hasMany, exemple
public function posts()
{
return $this->hasMany(\App\Post::class);
}
public function projects()
{
return $this->hasMany(\App\Project::class);
}
ou crée une fonction générique du type
public function categorized(string $classModel)
{
return $this->hasMany($classModel)->getResults();
}
Et après où tu en as besoin, tu pourras appeler la méthode
$posts = Category::first()->categorized(\App\Post::class);
Bonjour
Ça vien à la même chose. Il y a pas un moyen de automatiser le système avec la fonction sync() de Laravel et avec une table de pevot. Je pense que ta solution est le meilleur moyen. Je veux que le système sois le plus extensible et assez modulabe possible.
Tu ne trouveras pas de fonctions qui automatise ce que tu veux faire, je viens de t'expliquer que ton projet n'est pas polymorphique, regarde ma solution car elle répond à tes besoins. Essaie d'implémenter ma solution et si elle ne marche pas on en reparle.