Laravel 6

Ajout dans 2 tables avec create

Avatar de TamaraMonney
TamaraMonney

Bonjour Je débute sous laravel et je n'arrive pas à insérer des données dans plusieurs tables avec le même formulaire. J'ai regardé les tutoriels et fouillez le forum mais il doit y avoir un détail qui m'échappe.

J'ai une base de données licences et une autres dates Dans ma base de données j'ai un champ licences_id

dans le model Licence j'ai

namespace App;

use Illuminate\Database\Eloquent\Model;
use app\Date;

class Licence extends Model
{
    protected $fillable = ['user_id', 'type', 'name', 'email', 'password', 'date_debut', 'date_fin', 'renew', 'key', 'poste', 'statut'];

    public function date()
    {
        return $this->belongsTo(Date::class, 'licences_id', 'id');
    }
}

dans Date

namespace App;

use Illuminate\Database\Eloquent\Model;
use app\licence;


class Date extends Model
{
    protected $fillable = ['date_debut', 'date_fin', 'licences_id'];

    public function licence()
    {
        return $this->hasMany(Licence::class);
    }
}

et dans LicenceController

    public function run()
    {
      request()->validate([
        //'type'      => ['required'],
        'name'      =>['required'],
        //'date_debut'=>['required'],
        //'date_fin'  =>['required'],
        'renew'     =>['required'],
        'poste'     =>['required'],
        'user_id'   =>['required'],
        'renwew'    =>['required'],
      ]);
    $licences = Licence::create([
        'user_id'    => request('user_id'),
        'name'       => request('name'),
        'type'       => request('type'),
        'poste'      => request('poste'),
        'key'        => request('key'),
        'email'      => request('email'),
        'password'   => request('password'),
        'renew'      => request('renew'),
        'statut'     => request('statut'),
        ]);
    $id     = Licence::all()->latest('id');
    $dates = Date::create([
          'licences_id'=> request($id),
          'date_debut' => request('date_debut'),
          'date_fin'   => request('date_fin'),
        ]);


        flash("Licence ajoutée avec succès.")->success();
        return back();

    }

vous allez me dire c'est bizarre, la ligne pour récupérer l' $id mais c'était en désespoire de cause Pour le formulaire je suis assez sûre de moi vu que celui-ci fonctionnait avant de séparer les dates dans une nouvelle table

si quelqu'un peut m'aider, je le remercie d'avance

Avatar de bestmomo
bestmomo

Salut,

La validation semble légère avec juste des required.

En général pour le nom d'une relation dans le sens hasMany on préfère mettre un pluriel, donc licences plutôt que license puisqu'on en a plusieurs, mais c'est du détail.

Pour ce qui concerne la question je pense que le code peut être simplifié pour enregistrer la license :

$licence = Licence::create($request->all());

Pour la date en relation :

$license->date()->create([
   'date_debut' => request('date_debut'),
   'date_fin'   => request('date_fin'),
]);
Avatar de TamaraMonney
TamaraMonney

merci pour ton aide. effectivement la validation est légère, je vais l'améliorer une fois que ce sera opérationnel. par contre, ça n'enregistre pas en base de données mais ça ne me met pas d'erreur.

pour la date en relation j'ai aussi essayé

$licence->date->create([
           'date_debut' => request('date_debut'),
           'date_fin'   => request('date_fin'),
        ]);

pas d'enregistrement

Avatar de bestmomo
bestmomo

J'avais pas fait attention à ta façon de récupérer les entrées, en général on fait comme ça :

$license->date()->create([
   'date_debut' => $request->date_debut,
   'date_fin'   => $request->date_fin,
]);
Avatar de TamaraMonney
TamaraMonney

si je met le texte tel quel j'ai une erreur de requette à la 2ème ligne.

je dois mettre tout le code dans la même fonction, c'est juste?

il doit me manquer quelque chose mais je ne vois pas.

Avatar de bestmomo
bestmomo

Mais la license s'enregistre bien ?

Avatar de TamaraMonney
TamaraMonney

non il n'y a rien dans la table

Avatar de bestmomo
bestmomo

Avec ce code ?

$licence = Licence::create($request->all());
Avatar de maitrepylos1
maitrepylos1

On est bien d'accord que $request prend bien $ Le validdate ne doit pas être dans un tableau

   $request()->validate([
        //'type'      => 'required',
        'name'      =>'required',
        //'date_debut'=>'required',
        //'date_fin'  =>'required',
        'renew'     =>'required',
        'poste'     =>'required',
        'user_id'   =>'required',
        'renwew'    =>'required',
      ]);

Le $request se travaille comme un objet

 $licences = Licence::create([
        'user_id'    => $request->user_id,
        'name'       => $request->name,
        'type'       => $request->type,
      
        ]);

Que le id de la $licence est déjà dans l'instance

// $id     = Licence::all()->latest('id');
$id = $licence->id
Avatar de TamaraMonney
TamaraMonney

Avec ce code ? $licence = Licence::create($request->all());

oui avec ce code

@maitrepylos1 tout est dans le même fichier je n'ai pas mis cette ligne de code mais même avec ça ne change rien. Au niveau de mes models, est-ce que c'est juste?

$id = $licence->id

Avatar de TamaraMonney
TamaraMonney

problème résolu, si ça peut aider quelqu'un

$licence = Licence::create(request()->all());

et

$licence->dates()->create([
   'date_debut' => request('date_debut'),
    'date_fin'   => request('date_fin'),
]);
Avatar de bestmomo
bestmomo

Salut,

Pour faire un peu de lumière sur la question.

Habituellement on injecte la requête dans la fonction du contrôleur :

use Illuminate\Http\Request;
...
public function run(Request $request)
    {

Après on peut utiliser la requête avec la variable $request :

$licence = Licence::create($request->all());
$licence->dates()->create([
   'date_debut' => $request->date_debut,
    'date_fin'   => $request->date_fin,
]);

Plutôt que d'injecter la requête on peut utiliser l'helper request(), c'est ce que tu as fait. Le fait d'utiliser l'helper est en fait équivalent à écrire :

app('request')

Ce qui a pour effet de créer une instance. D'autre part quand on écrit :

request('date_debut')

C'est comme si on écrivait :

app('request')->__get('date_debut')

Il me semble que l'injection est la méthode à privilégier parce que la plus lisible.

Vous ne pouvez pas répondre à ce sujet.