0
votes

Laravel Update utilise parfois 'insertion' SQL

Je ressens un problème étrange avec la mise à jour des enregistrements de Laravel. J'utilise ce code pour mettre à jour un enregistrement: xxx pré>

Le code exécute bien pour la première fois. Cependant, lorsque j'essaie de mettre à jour le même record, je reçois l'erreur p>

SQLSTATE [23000]: Violation de la contrainte d'intégrité: 1062 Entrée en double 'F17 / 2019/2019' Pour la clé 'primaire' (SQL: insérer dans étudiants code> ( reg_Number code>, nom code>, niveau_id code>, mise à jour_at code>, créé_at code>) (F17 / 2019/2019, John fait, 5, 2019-08-08 10:31:52, 2019-08-08 10:31:52))). P> BlockQuote>

Cependant, après un certain temps, disons une demi-heure environ, je peux mettre à jour l'enregistrement sans l'erreur, mais une seule fois. Un deuxième essai ramène l'erreur. P>

J'ai essayé diverses autres techniques discutées dans Cette question , mais les résultats sont identiques. L'erreur suggère que Laravel opte à utiliser insert code> au lieu de la relève code> Mettre à jour code> SQL, alors que l'enregistrement existe et j'ai explicitement spécifié qu'il devrait mettre à jour un enregistrement existant. P >

Est-ce que quelqu'un sait ce qui se passe ici? p>


Je suis USG MYSQL, mes élèves Table Tableau principale est reg_Number de type Varchar. Le contrôleur étudiant ressemble à: P>

namespace App;
use Illuminate\Database\Eloquent\Model; 
class Student extends Model
{
    protected $fillable = [
        'reg_number', 
        'name', 
        'level_id', 
        'status' 
    ];
    protected $primaryKey = 'reg_number';
    public $incrementing = false;
}


6 commentaires

S'il vous plaît n'utilisez pas de nouveaux étudiants (); Pour les enregistrements existants, utilisez étudiant :: Trouver ()


Lorsque vous définissez Existe , le code met à jour un enregistrement existant. Veuillez suivre le lien dans ma question. En outre, le fait que les mises à jour de l'enregistrement pour la première fois devraient vous indiquer que l'erreur ne provient pas de l'utilisation de nouvel élève () .


Le lien a des réponses de plus de 3 ans il y a 3 ans, je ne ferais pas autant confiance à ce que les propriétés existent sont d'autres comme $ widrcemment créé si vous creusez la source. Le moyen recommandé d'obtenir des modèles existants est de les hydrater de la DB.


@DPAROLI Le existe fonctionne réellement à Laravel 5.8. Essaye le.


Dans votre cas cela ne fonctionne pas, votre question est pour cela. Je ne comprends pas pourquoi vous ne voulez pas trouver le modèle dans la DB, je manque quelque chose?


@dparoli Consultez ma réponse ci-dessous et divers autres commentaires que j'ai faits. Cela fonctionne en fait.


3 Réponses :


3
votes

Vous devez trouver l'étudiant que vous souhaitez mettre à jour. Parce que nouveau créera toujours une nouvelle instance de modèle et lorsque vous enregistrez, il créera de nouveaux enregistrements au lieu de la mise à jour.

$data = [
   // Column values you want to update
   'exists' => 'value' 
    ... 
    'status' => 'value'
];

Student::where('id', $id)->update($data)


3 commentaires

Aucun de ces travaux. S'il vous plaît vérifier le lien dans ma question. Il a toutes ces solutions. Cependant, j'ai découvert que l'erreur provient d'une autre partie de mon code que je n'ai pas de posté. Je fermerai la question comme le problème n'est pas réellement avec le code que j'ai posté. PS: Mon code mettrait toujours à jour le dossier sans modification. En effet, lorsque vous définissez existe sur un enregistrement, il utilise la fonction de mise à jour et ne crée pas de nouveau.


@Ttroublezero Vous pouvez utiliser la méthode UpdateOrcreate pour y parvenir.


En fait, j'utilisais une sorte de updateocreate . La fonction que j'utilisais pour appeler le code pour mettre à jour l'enregistrement est quelque chose comme ceci: Fonction publique AddStudent (Demande de demande) {Si ($ demande-demande-> post ('Status')! == Null) {$ Ceci -> UpdaStudent (Demande de $); retourner faux; } ... et c'est là que l'erreur résultait de comme je vérifiait $ Demande-> post ("statut ') qui était parfois null lors de la mise à jour.



0
votes

Essayez de modifier la valeur de false à true xxx


1 commentaires

J'ai déjà découvert ce que je faisais mal. Toutefois, $ incrémentation est nécessaire car la clé principale est de type de données VARCHAR.



0
votes

J'ai eu une erreur dans une autre partie du code que je n'avais pas posté. J'ai la fonction xxx

et c'est là que l'erreur résultait de comme je vérifiait $ Demande-> post ("statut") qui était parfois null lors de la mise à jour. S'il vous plaît voter la question à fermer car l'erreur ne résulte pas de la partie du code que j'ai affiché.

Je me frappais la tête parce que Laravel est parfois ambigu avec des rapports d'erreur. Si elle a déclaré le numéro de ligne ou la fonction qui causait l'erreur, je vous aurais débuté beaucoup et n'aurait pas fini de poster une question non pertinente.


1 commentaires

Ok sympa, vous avez trouvé par vous-même :), nous avons été le canard en caoutchouc.