Découvrir Eloquent, l'ORM de Laravel
Comment fonctionne les migrations :
A chaque fois que l'on souhaite modifier la base de données (ajouter, modifier, supprimer une table), il est nécéssaire de créer une nouvelle migration :
- Une migration est unique et ne doit pas être modifiée.
- On peut modifier plusieurs tables dans la même migration
- la fonction up() réalise les modifications indiquées lors du
php artisan migrate
- la fonction down() réalise les modifications indiquées lors d'un retour en arrière (s'il y a une erreur) lors d'un
php artisan migrate:rollback
Créer une migration
Créer une migration :
php artisan make:migration Nom_de_La_migration
Le nom de la migration n'impacte en rien la table mais sert uniquement d'indication sur son objectif, ex :
Create_users_table
,add_firstname_to_users_table
etc
Si la migration consiste à créer une table, on peut ajouter "--create=nomdelatable" :
php artisan make:migration Nom_de_La_migration --create=nomdedatable
Création d'une table
Création d'un modèle :
php artisan make:model Nomdelatable
⁉️ Si l'on souhaite pouvoir intéragir avec la bdd (Envoyer et Récupérer des informations en base de données), il nous faut créer un modèle. Cette commande va également créer automatiquement une migration.
Exemple de migration pour créer une table :
class AddMessage extends Migration
{
public function up()
{
Schema::create('messages', function (Blueprint $table) {
$table->increments('id');
$table->integer('from_id')->unsigned();
$table->integer('to_id')->unsigned();
$table->foreign('from_id', 'from')->references('id')->on('users')->onDelete('cascade');
$table->foreign('to_id', 'to')->references('id')->on('users')->onDelete('cascade');
$table->text('content');
$table->timestamp('created_at')->useCurrent();
$table->dateTime('read_at')->nullable();
});
}
public function down()
{
Schema::drop('messages');
//Lorsque la migration est faite en sens inverse, on supprime la table message
}
}
Exemple de modèle d'une table :
class Message extends Model
{
protected $fillable = [
'content', 'from_id', 'to_id', 'read_at', 'created_at'
];
protected $dates = ['created_at', 'read_at'];
public $timestamps = false;
public function from() {
return $this->belongsTo(User::class, 'from_id');
}
}
⚠️ Les colonnes modifiables doivent être présent dans le tableau $fillable. Mettre à jour la base de données :
php artisan migrate
Pour annuler la migration en base de données :
php artisan migrate:rollback
Modification d'une table :
Pour modifier une table, il suffit d'indiquer les modifications dans une nouvelle migration.
Créer une migration :
php artisan make:migration Nom_de_La_migration
Le nom doit indiquer le changement effectué dans la migration, exemple : 'add_firstname_to_users_table'
Pour modifier une colonne existante :
public function up()
{
Schema::table('messages', function (Blueprint $table) {
$table->integer('content')->unsigned()->nullable();
});
}
public function down()
{
//
}
⚠️ Ici, on modifie simplement une colonne existante, on n'a donc pas besoin de compléter la fonction down()
Pour ajouter une colonne :
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('firstname')->nullable();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('firstname');
});
}
⚠️ Ici, on ajoute une colonne, on précise alors à la fonction down() (retour en arrière) que si l'on souhaite revenir en arrière (php artisan migrate:rollback
), il doit exécuter la commande inverse, c'est à dire supprimer la colonne.
Mettre à jour la base de données :
php artisan migrate
Annuler les modifications en base de données :
php artisan migrate:rollback
Supression d'une table
Pour supprimer une table :
public function up()
{
Schema::drop('messages');
}
Pour revenir en arrière, il suffit de supprimer cette migration et de refaire un
php artisan migrate
Table liées
Vidéo -> 5min 30
Attributs disponibles pour les migrations :
- -> increments() : Permet d'auto-incrémenter (utilisé en général pour l'id)
- -> unique() : Permet de rendre un élément unique
- -> nullable() : Permet de rendre un élément non obligatoire
- -> after('column') : Permet de positionner une colonne après une autre en base de données
- -> unsigned() : OBLIGATOIRE pour des colonnes de type foreign key. Défini un élément comme non assigné à sa création.
- -> references('column')->on('table')->onDelete('cascade') : Permet de lier une colonne à une colonne d'une autre table et à supprimer en cascade
- -> useCurrent() : Pour une date, permet de la générer automatiquement
- -> default() : Permet de définir une valeur par défaut
- -> change() : Permet de modifier une colonne déjà existante (requiert doctrine/dbal) (composer require doctrine/dbal)