Je ressens un problème étrange avec la mise à jour des enregistrements de Laravel. J'utilise ce code pour mettre à jour un enregistrement: 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 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 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>
é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> 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 >
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;
}
3 Réponses :
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)
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 code> 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 code>. 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; } code> ... et c'est là que l'erreur résultait de comme je vérifiait $ Demande-> post ("statut ') code> qui était parfois null lors de la mise à jour.
Essayez de modifier la valeur de
J'ai déjà découvert ce que je faisais mal. Toutefois, $ incrémentation code> est nécessaire car la clé principale est de type de données VARCHAR.
J'ai eu une erreur dans une autre partie du code que je n'avais pas posté. J'ai la fonction 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é. P> 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. P> P>
Ok sympa, vous avez trouvé par vous-même :), nous avons été le canard en caoutchouc.
S'il vous plaît n'utilisez pas de nouveaux étudiants (); Pour les enregistrements existants, utilisez étudiant :: Trouver ()
Lorsque vous définissez
Existe code>, 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 denouvel élève () code>.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éé code> si vous creusez la source. Le moyen recommandé d'obtenir des modèles existants est de les hydrater de la DB.@DPAROLI Le
existe code> 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.