web-dev-qa-db-fra.com

Laravel valeur par défaut de la migration

Je n'ai pas compris quel est l'effet de l'option default dans les migrations.

Je peux voir que la colonne dans la base de données est définie avec une valeur par défaut, mais les modèles l'ignorent complètement. Disons que j’ai un modèle Book qui reflète la table books de la base de données. J'ai migration pour créer la table des livres:

Schema::create('bools', function (Blueprint $table) {
    $table->increments('id');
          ->string('author');
          ->string('title');
          ->decimal('price', 4, 1)->default(100);
          ->timestamps();
});

Quand je crée une nouvelle instance de modèle Book, je vois:

$book = new Book();
var_dump($book->price); //Always 0...

La valeur par défaut est ignorée et l'attribut n'est pas défini correctement. Ok, je peux l’obtenir, car c’est un nouvel objet et il ne devrait pas obtenir les valeurs par défaut de la base de données. Mais si j'essaie de sauvegarder un modèle comme:

$book = new Book();
$book->author = 'Test'
$book->title = 'Test'
$book->save();

Il enregistre dans le champ price dans la base de données!

Alors, quel est l'intérêt de l'option default dans les migrations?

A propos ... Ce n'était pas mieux si le modèle voit à l'intérieur de la migration (s'il existe) quels sont les types de champs et le comportement à la place pour le définir manuellement dans le modèle et la migration? Et de plus, même pour créer automatiquement un validateur pour le modèle. Je pense que cela a été possible avec un petit changement de la structure de migration, alors pourquoi ce n'est pas comme ça?

30
nrofis

Mettez la valeur par défaut entre guillemets simples et tout fonctionnera comme prévu. Un exemple de migration:

$table->increments('id');
            $table->string('name');
            $table->string('url');
            $table->string('country');
            $table->tinyInteger('status')->default('1');
            $table->timestamps();

EDIT: dans votre cas -> default ('100.0');

67
Khan Shahrukh

Vous pouvez simplement mettre la valeur par défaut en utilisant default (). Voir l'exemple

 $table->enum('is_approved', array('0','1'))->default('0');

J'ai utilisé enum ici et la valeur par défaut est 0.

1
Rohit Kumar Sharma