J'utilise laravel 6. J'ai créé une table appelée 'student', où l'incrément de valeur de la colonne 'id' est censé se produire mais ne se produit pas. M'aider à résoudre le problème est très utile. Voici mon fichier de migration:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateStudentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('students', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email');
            $table->bigInteger('phone');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('students');
    }
}

Dans ma table d'étudiants:

enter image description here

Mon fichier StudentController:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Student;
class StudentController extends Controller
{
   public function student()
   {
        return view('student.create');
   }


   public function index()
   {
        $student = Student::all();
        return view('student.index', compact('student'));
   }

   public function store(Request $request)
   {
     $validatedData = $request->validate([
        'name' => 'required|max:50|min:5',
        'phone' => 'required|unique:students|max:12min:9',
        'email' => 'required|unique:students',
         ]);


    $student = new Student;
    $student->name = $request->name;
    $student->email = $request->email;
    $student->phone = $request->phone;
    $student->save();
    $notification = array(
            'message' => 'Data Insert Done!', 
            'alert-type' => 'success'
            );

            return Redirect()->route('all.category')->with($notification);

    // DB::table('student')->insert($data)
   // return response()->json($student);

   }


   public function ViewStudent()
   {
        
   }

   
}

Fichier modèle:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
       protected $fillable = [
        'id','name', 'email', 'phone',
    ];
}

Merci d'avance.

1
Humayun Ahmad Rajib 30 août 2020 à 00:13

3 réponses

Meilleure réponse

Il est possible que vous travailliez avec une base de données dont le schéma a été défini pour la table students soit manuellement (pas par migration, mais, par exemple, en exécutant une requête SQL où l'incrémentation automatique n'a pas été définie), ou après l'application de la migration, l'incrémentation automatique a été supprimée.

Parce que votre code de migration est correctement rédigé conformément à la documentation officielle Laravel pour la méthode increments(string $attribute):

enter image description here

Je vois deux solutions ici:

  1. modifier une colonne de table via une requête SQL afin qu'elle corresponde à la description de la migration

ALTER TABLE students CHANGE id id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY;

Ou la même chose en utilisant des outils phpmyadmin ou IDE;

  1. générer un schéma en utilisant votre migration (php artisan migrate --path=database/migrations/..._create_students_table.php), mais pour cela, vous devez au préalable enregistrer les données de la table des étudiants, par exemple, dans un vidage.

Puisque vous utilisez phpmyadmin , regardez les paramètres de l'attribut id dans le tableau students.

1
Vitaly Vesyolko 29 août 2020 à 21:56

À en juger par le code de votre contrôleur, je suppose que l'erreur se trouve quelque part dans la ligne où vous récupérez une instance de votre modèle d'étudiant

Changement

 $student = new Student;

À

  $student = new Student();

Vous avez besoin d'une nouvelle instance d'un modèle spécifique afin d'insérer un nouvel identifiant, veuillez également publier votre code de modèle actuel.

Exemple de code de modèle.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Product extends Model
{
    use SoftDeletes;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'product_bar_code', 'product_name', 'product_image', 'product_price'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = ['created_at', 'updated_at', 'deleted_at'];
}

Peut-être que quelque chose ne va pas avec la façon dont vous avez écrit le code de votre modèle.

1
Ainz-sama 29 août 2020 à 21:47

La seule raison à laquelle je peux penser est si vous avez fait quelque chose comme ça dans votre modèle:

    /**
     * Indicates if the IDs are auto-incrementing.
     *
     * @var bool
     */
    public $incrementing = false;

Si tel est le cas, il doit être défini sur true ou entièrement supprimé.

Ensuite, assurez-vous que votre id est gardé dans votre modèle comme ceci:

/**
 * The attributes that aren't mass assignable.
 *
 * @var array
 */
protected $guarded = ['id'];

De cette façon, vous évitez les affectations en masse.

1
tsommie 29 août 2020 à 21:28