Skip to content

Types de champs & clés primaires ​

Les champs se déclarent en paires nom:type, séparées par des virgules :

bash
php artisan make:fullapi Product --fields="name:string,price:decimal,stock:integer,meta:json"

Types supportés ​

TypeColonne BDDType PHPRègle de validation
stringVARCHAR(255)stringstring|max:255
textTEXTstringstring
integer / intINTEGERintinteger
bigintBIGINTEGERintinteger
boolean / boolBOOLEANboolboolean
float / decimalDECIMAL(8,2)floatnumeric
jsonJSONarrayarray
dateDATEDateTimeInterfacedate
timeTIMEstringdate_format:H:i,H:i:s
datetimeDATETIMEDateTimeInterfacedate
timestampTIMESTAMPDateTimeInterfacedate
uuidUUIDstringuuid
enum(a,b,...)ENUM('a','b')backed enum + castRule::enum()

Chaque type se propage dans toute la pile : colonne de migration, règles de validation, cast du modèle, valeur de factory, type de propriété du DTO et @property du PHPDoc.

Champs enum natifs ​

bash
php artisan make:fullapi Article --fields="title:string,status:enum(draft,published,archived)"

Une seule définition de champ produit toute la chaîne. Voici le code qu'écrit la commande ci-dessus, réduit aux lignes qui concernent l'enum :

php
namespace App\Enums;

enum ArticleStatus: string
{
    case Draft = 'draft';
    case Published = 'published';
    case Archived = 'archived';
}
php
/**
 * @property int $id
 * @property string $title
 * @property ArticleStatus $status
 * @property Carbon|null $created_at
 * @property Carbon|null $updated_at
 */
class Article extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'status'];

    protected function casts(): array
    {
        return [
            'status' => ArticleStatus::class,
        ];
    }
}
php
public function rules(): array
{
    return [
        'title' => 'required|string|max:255',
        'status' => ['required', Rule::enum(ArticleStatus::class)],
    ];
}
php
public function definition(): array
{
    return [
        'title' => fake()->word(),
        'status' => fake()->randomElement(ArticleStatus::cases()),
    ];
}
php
Schema::create('articles', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->enum('status', ['draft', 'published', 'archived']);
    $table->timestamps();
});

L'enum porte le nom de l'entité et du champ, ArticleStatus ici, si bien que deux entités peuvent avoir chacune leur status.

Dans un fichier de schéma :

yaml
status: enum(draft,published) default=draft

Clés primaires personnalisées ​

Ajoutez :primary (CLI) ou le modificateur primary (fichier de schéma) pour faire d'un champ la clé primaire à la place de l'id auto-incrémenté :

bash
php artisan make:fullapi Country --fields="code:string:primary,name:string"

Toute la pile suit automatiquement :

  • Migration : $table->string('code')->primary(), pas de $table->id()
  • Modèle : $primaryKey, $incrementing = false, $keyType déclarés
  • Relations entrantes : la FK est nommée country_code, typée comme la clé, avec ->references('code') dans la migration et exists:countries,code en validation
  • Les tests générés utilisent getKey() pour passer avec les deux styles de clé

Nullable, unique et valeurs par défaut ​

La syntaxe --fields s'en tient à nom:type. Pour les contraintes par champ, utilisez l'assistant interactif ou un fichier de schéma, qui accepte un raccourci ou un mapping :

yaml
fields:
  title: string
  slug: string unique
  content: text nullable
  views: { type: integer, default: 0 }