Laravel 5

Table intermédiaire ne voulant se remplir qu'à moitié

  • Avatar de a7z8e9z8a7
    Membre depuis :
    09/12/2017
    Messages :
    15

    Bonjour les gens,

    On m'a fourni une base de données toute neuve avec laquelle je dois obligatoirement travailler, car ils travaillent à l'ancienne, les migrations ils ne connaissent pas. Il n'y aura donc pas de fichier de migration. Ce qui fait que rien n'est respecté, les tables s'appellent n'importe comment sans aucune logique.

    • J'ai une table actucentrale contenant la liste des actualités que l'utilisateur de mon projet peut créer ;
    • Une table backup contenant la liste de noms de toutes les instances du logiciel phare distribué par ma boite, dont la clé primaire s'appelle non pas id mais instance;
    • Une table intermédiaire instances_actucentrale (car relation belongsToMany) contenant donc la colonne id_actucentrale faisant référence à la colonne id de actucentrale, et la colonne instance faisant elle référence à la colonne instance de backup.

    Je n'explique pas ce résultat :
    Cannot insert the value NULL into column 'id_actucentrale', table 'backup.dbo.instance_actucentrale'; column does not allow nulls. INSERT fails. (SQL: insert into [instance_actucentrale] ([id_actucentrale], [instance]) values (, dev1)).

    Et dans la console de debug, toutes les infos rentrées sont bien reconnues, le tableau d'instances également. En supprimant toute mention de instances_list et date_publication_affichee, ça enregistre bien les champs restants (pas le reste évidemment). Surement donc que le problème trouve son origine par ici...

    En vous remerciant...

    <?php
    class Actualite extends Model
    {
    protected $table = 'actucentrale';
    protected $dates = ['created', 'modified'];

    const CREATED_AT = 'created';
    const UPDATED_AT = 'modified';

    Une actu c'est forcément par un seul utilisateur
    public function users() {
    return $this->belongsTo('App\User');
    }

    public function instances() {
    return $this->belongsToMany('App\Instance', 'instance_actucentrale', 'id_actucentrale', 'instance');
    }

    public function getInstancesListAttribute(){
    if($this->id){
    return $this->instances->pluck('instance');
    }
    }

    public function setInstancesListAttribute($value){
    return $this->instances()->sync($value);
    }
    }
    <?php
    public function store(ActualitesRequest $request)
    {
    $actualite = new Actualite;
    $actualite->titre = $request->titre;
    $actualite->intro = $request->intro;
    $actualite->texte = $request->texte;
    $actualite->instances_list = $request->instances_list;
    $actualite->date_publication_affichee = $request->date_publication_affichee;
    $actualite->save();
    return redirect(route('actualites.edit', $actualite));
    }
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2123

    Salut,

    Il faudrait vérifier ce qui arrive dans ton mutateur :

    public function setInstancesListAttribute($value){

    dd($value);

    return $this->instances()->sync($value);
    }

    Je pense qu'il doit y avoir une valeur qui ne correspond à aucun enregistrement.

  • Avatar de a7z8e9z8a7
    Membre depuis :
    09/12/2017
    Messages :
    15

    array:2 [▼
    0 => "dev1"
    1 => "dev2"
    ]

    Voici le résultat... Rien d'anormal à priori de ce côté là

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2123

    Je pense que le problème vient du fait que tu veux faire la synchro avant que le modèle ait été enregistré dans la base. Il faudrait procéder en deux étapes et ne pas utiliser un setter.

  • Avatar de a7z8e9z8a7
    Membre depuis :
    09/12/2017
    Messages :
    15

    Ca marche ! J'ai donc supprimé

    public function setInstancesListAttribute($value){
    return $this->instances()->sync($value);
    }

    et mis un

    $actualite->instances()->sync($request->instances_list);

    après le save() dans le contrôleur, et supprimé le

    $actualite->instances_list = $request->instances_list;

    Pourtant, la technique précédente fonctionnait chez un mec dans un tuto vidéo... Sur une version inférieure de Laravel certes (toujours en 5 quand même)

    Merci beaucoup !

Vous ne pouvez pas répondre à ce sujet.