0
votes

Comment définir la valeur pour une colonne supplémentaire dans la table pivot en octobercms?

J'ai médecin et spécialisation table et avoir doctor_specialization_pivot table. Dans ma table pivot, j'ai les colonnes suivantes:

| doctor_id | supplémentaire_data | Spécialisation_id |

supplémentaire_data est du modèle Médecin avec le doctor_id .

Dans mon fichier docteur , j'ai cette relation: xxx

maintenant lors de la soumission de formulaire, je reçois cette erreur:

sqlstate [HY000]: Erreur générale: 1364 Champ 'supplémentaires_Data' n'a pas de valeur par défaut (SQL: Insert dans le doctor_specialization_pivot (doctor_id, spécialisations_id) valeurs (1, 3)) " < / p>

J'ai essayé d'ajouter à ma relation 'pivot' => ['"supplémentaire_data'] . Mais toujours obtenir la même erreur.

J'ai vérifié les données soumises et additionnel_data n'est pas vide. J'ai vérifié des forums d'octobercms mais ne recevez pas de réponses directes telles que Ceci et Ce .


2 commentaires

Pouvez-vous mentionner comment vous sauvegardez ces données? Sous une forme frontale ou un formulaire de contrôleur d'extrémité backend?


Pouvez-vous également nous montrer ce que vous voulez dire que le "supplémentaire_data n'est pas vide" ??


3 Réponses :


1
votes

d'accord. J'ai trouvé la réponse à ma propre question.

Je vais répondre en détail pour aider tout le monde. Après avoir creusé et aveugle. Selon cette documentation ici , nous pouvons utiliser le méthode joindre () code> pour joindre un rôle à un utilisateur en insérant un enregistrement dans la table intermédiaire qui rejoint les modèles em>. P>

Qu'est-ce qui me confondre dans le La documentation est que cela utilise un $ vagabide code> variable et je n'ai pas compris où le $ ROOKID code> est venu de. Si c'est le ID code> de la table parent ou du ID code> d'une autre table. P>

échantillon de la liaison: P>

public function beforeSave()
{
    $this->specialization()->attach($this->specialization,['additional_data' => 'additional data from doctor table']);
}


3 commentaires

Le $ ROOKID est le numéro d'identification de l'enregistrement (dans cet exemple le modèle de rôles) que vous souhaitez attacher au modèle parent. Vous pouvez donc faire $ rôle-> utilisateurs () -> joindre ($ userid) dans inverse. Hypothétiquement. Savez-vous cela dans le backend? Ou avez-vous une extrémité avant et utilisez-vous le code PHP ou une fonction de composant? Ceci n'est jamais expliqué dans votre question et les deux auraient une réponse différente.


J'utilise un builderPlugin pour cela, je n'ai rien changé de sauvegarde, c'est juste la valeur par défaut des octobercms. J'ai un problème avec ma réponse. Lorsque je mettez à jour mon formulaire et modifié la valeur du spécialty_id dans le formulaire. Au lieu de mettre à jour l'enregistrement de table pivot, il insère un nouvel enregistrement peut-être dû à joindre () méthode. Donc, je cherche une réponse différente peut-être que quelqu'un pourrait.


Vous enregistrez donc les enregistrements dans le backend comme exemple.com/backend/plugin/model/create|update . Oui, je travaille sur une réponse pour vous entre le travail. Besoin de regarder mes notes.



1
votes

La mise en œuvre est à peu près comme Cette vidéo de la montre apprendre (ivan). Vous pouvez apprendre beaucoup sur OctoberCMs simplement en surveillant son guide dessus. Voici le Documentation sur elle aussi. Ceci est l'exemple des informations que j'ai faites.

AVERTISSEMENT Un autre défaut connu est que vous ne pouvez pas l'appliquer à un enregistrement de modèle qui n'est pas encore créé. Contrairement au widget de relation standard qui attend jusqu'à ce qu'il soit enregistré avant d'attacher des enregistrements, cela attache des enregistrements dans une forme de superposition séparée.

voici mon Model.php relation: < Pré> xxx

voici mon contrôleur.php : xxx

voici mon config_relation.yaml : xxx


3 commentaires

J'ai regardé la vidéo et c'est très utile. Mais je pense que le lien était davantage sur la gestion / l'affichage de la relation dans le backend. Mon problème est que lorsque l'utilisateur soumettez un formulaire, je souhaite enregistrer une valeur supplémentaire à partir du formulaire à la table de relation dans la base de données. La réponse que j'avais résolue l'ajout mais doit travailler sur cette question de la mise à jour. Nous avons un problème similaire avec celui-ci Stackoverflow.com/Questtions/50241697/... qui n'a pas encore de réponse.


Je vérifie l'événement Beforeattach dans la documentation mais je n'ai pas pu trouver Un moyen de modifier les attributs (ou d'ajouter ['supplémentaires_data' => 'Mes données'] avant de l'enregistrer dans la base de données ..


Je vous ai demandé si vous utilisez le backend pour soumettre ces informations. Vous devez montrer comment les utilisateurs soumettent le formulaire, comme le code PHP que vous utilisez. Votre question manque d'informations maintenant.



0
votes

Je vais juste faire une nouvelle réponse et supposer est ce dont vous avez besoin car vous n'avez pas encore montré à n'importe quel code sur la façon dont votre formulaire fonctionne. Voici comment je voudrais mettre à jour les informations de pivot à partir d'un formulaire frontal.

relation dans modèle.php code>: p> xxx pré>

puis dans un code PHP Permet de l'appeler Onaddspecialization () code>: p> xxx pré>

maintenant un exemple de mise à jour de nos données supplémentaires: p>

public function onUpdateAdditionalData() {
    //Calling a function to get the doctor id maybe from the signed in user
    $doctor = Doctors::find($this->$doctorId());

    //If you get specialization by id from an input. I believe you need to go through the relationship in order to access the correct pivot information.
    $specialization = $doctor->specialization->where('id', Input::get('specialization_id'))->first();

    //Insert the new pivot information
    $specialization->pivot->additional_data = $new_additional_data;

    //Save
    $specialization->pivot->save();
}


0 commentaires