Aller au contenu

Modèles & Base de données

ArtisanCMS utilise Eloquent ORM avec 37 modèles, 45 migrations et un préfixe cms_ sur toutes les tables. Cette page décrit la structure de la base de données et les relations entre les entités.

ModèleTableDescription
Pagecms_pagesPages du site (soft deletes)
Postcms_postsArticles de blog (soft deletes)
ContentTypecms_content_typesTypes de contenu personnalisés
Revisioncms_revisionsHistorique des révisions (polymorphique)
Blockcms_blocksBlocs du Page Builder
BlockPatterncms_block_patternsModèles de blocs réutilisables
GlobalSectioncms_global_sectionsSections globales (header, footer)
Popupcms_popupsPopups et modales
Widgetcms_widgetsWidgets de sidebar/footer
ModèleTableDescription
Taxonomycms_taxonomiesDéfinition des taxonomies
Termcms_termsTermes (catégories, tags)
Termablecms_termablesTable pivot polymorphique
ModèleTableDescription
Mediacms_mediaFichiers médias uploadés
MediaFoldercms_media_foldersDossiers de la bibliothèque
ModèleTableDescription
Usercms_usersUtilisateurs du CMS
Rolecms_rolesRôles avec permissions JSON
ModèleTableDescription
Menucms_menusMenus de navigation
MenuItemcms_menu_itemsÉléments de menu
Redirectcms_redirectsRedirections 301/302
FormEntrycms_form_entriesSoumissions de formulaires
ModèleTableDescription
Themecms_themesThèmes installés
Plugincms_pluginsPlugins installés
Settingcms_settingsParamètres clé-valeur
CustomFieldcms_custom_fieldsChamps personnalisés (polymorphique)
DesignTokencms_design_tokensTokens de design
Brandingcms_brandingsConfiguration de la marque
ModèleTableDescription
ActivityLogcms_activity_logsJournal d’activité
Commentcms_commentsCommentaires
Notificationcms_notificationsNotifications
EmailTemplatecms_email_templatesTemplates d’emails
Newslettercms_newslettersCampagnes newsletter
NewsletterSubscribercms_newsletter_subscribersAbonnés newsletter
Webhookcms_webhooksConfiguration des webhooks
AnalyticPageViewcms_analytic_page_viewsVues de pages brutes
AnalyticAggregationcms_analytic_aggregationsDonnées agrégées
SearchIndexcms_search_indexIndex de recherche
ContentLockcms_content_locksVerrous d’édition
Sitecms_sitesSites (multi-site)

Les révisions et les champs personnalisés utilisent des relations polymorphiques pour s’attacher à tout type de contenu.

// Le modèle Revision
class Revision extends Model
{
public function revisionable(): MorphTo
{
return $this->morphTo();
}
}
// Utilisation depuis Page ou Post
class Page extends Model
{
public function revisions(): MorphMany
{
return $this->morphMany(Revision::class, 'revisionable');
}
}

Les termes de taxonomie sont liés au contenu via la table pivot polymorphique cms_termables.

class Page extends Model
{
public function terms(): MorphToMany
{
return $this->morphToMany(Term::class, 'termable', 'cms_termables');
}
}

Le modèle ContentLock empêche l’édition simultanée d’un même contenu.

class ContentLock extends Model
{
public function lockable(): MorphTo
{
return $this->morphTo();
}
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
TraitDescription
HasContentFeaturesAjoute les révisions, champs personnalisés, SEO, statut de publication
HasSiteScopeFiltre automatiquement les requêtes par site actif (multi-site)
LogsActivityEnregistre automatiquement les actions dans le journal d’activité
SoftDeletesSuppression douce sur Page et Post
class Page extends Model
{
use HasContentFeatures, HasSiteScope, LogsActivity, SoftDeletes;
}

Les 45 migrations sont exécutées lors de l’installation et suivent les conventions Laravel. Toutes les tables utilisent le préfixe cms_.

Fenêtre de terminal
# Exécuter les migrations
php artisan migrate
# Voir le statut des migrations
php artisan migrate:status

ArtisanCMS fournit 18 factories pour générer des données de test.

// Créer une page publiée
$page = Page::factory()->published()->create();
// Créer 10 articles avec des catégories
$posts = Post::factory()->count(10)->withCategories()->create();
// Créer un utilisateur avec un rôle
$admin = User::factory()->admin()->create();
// Créer un média avec un fichier image
$media = Media::factory()->image()->create();

Les factories disponibles couvrent : Page, Post, User, Role, Media, MediaFolder, Menu, MenuItem, Term, Taxonomy, Comment, Block, Widget, Popup, Notification, EmailTemplate, Newsletter et FormEntry.

SeederDescription
DatabaseSeederOrchestre tous les seeders
RoleSeederCrée les rôles par défaut (admin, éditeur, auteur, contributeur)
BlockSeederEnregistre les blocs intégrés dans la base
SettingsSeederInitialise les paramètres par défaut du CMS
Fenêtre de terminal
# Exécuter tous les seeders
php artisan db:seed
# Exécuter un seeder spécifique
php artisan db:seed --class=RoleSeeder
cms_users ──── cms_roles
├── cms_pages ──── cms_revisions (polymorphique)
│ │
│ ├── cms_termables ──── cms_terms ──── cms_taxonomies
│ ├── cms_custom_fields (polymorphique)
│ └── cms_content_locks
├── cms_posts ──── cms_revisions (polymorphique)
│ │
│ ├── cms_termables ──── cms_terms
│ ├── cms_custom_fields (polymorphique)
│ └── cms_comments
├── cms_media ──── cms_media_folders
└── cms_activity_logs