web-dev-qa-db-fra.com

Colonne introuvable: 1054 Colonne inconnue '0' dans la 'liste des champs' - Laravel - Je n'ai pas de colonne 0 n'importe où dans mon code

Je reçois cette erreur étrange:

SQLSTATE [42S22]: Colonne introuvable: 1054 Colonne inconnue '0' dans 'liste de champs' (SQL: mise à jour forum_threads Set 0 = Verrouillé, 1 = 1, updated_at = 2016-03-17 16:01:59 où topic_id = 3 et forum_threads. deleted_at Est nul)

Le fait est que je n'ai pas de colonne 0. Je n'ai pas de clause where avec un 0 N'importe où dans mon code. J'utilise une requête de portée.

Mon contrôleur est:

    $action = $request->input('action');
    $topic = $request->input('topic');
    $thread = Thread::where('topic_id', $topic);

    switch ($action) {
        case ('locked'):
            $thread->lock();
            break;
    }

Comme vous pouvez le voir, je ne fais pas grand-chose. J'essaie juste de verrouiller un fil. J'appelle la portée de verrouillage dans mon modèle Thread. J'ai beaucoup de boîtiers de commutation, dont l'un est lock. J'ai exécuté la moitié de la requête en haut, donc je n'ai pas à me répéter. Je l'ai simplement stocké dans la variable $thread Afin de pouvoir effectuer des actions comme $thread->delete() et $thread->restore().

Ma portée de requête dans le modèle de thread:

public function scopeLock($query)
{
    return $query->where('locked', 0)->update(['locked', 1]);
}

C'est tout. Je pense que c'est possible parce que j'ai une clause where passant de mon contrôleur (Thread::where('topic_id', $topic)) et je continue juste sur ma portée.

Toute aide est grandement appréciée.

11
Taylor

L'erreur est due à ->update(['locked', 1]); qui devrait être ->update(['locked' => 1]);

la fonction de mise à jour utilise un tableau comme "colonne" => "valeur", votre erreur de syntaxe provoque Laravel à penser [ 0 => 'locked', 1 => 1], donc cela se traduit par ce SQL SET 0 = 'locked', 1 = 1...

42
Moak

Comme je l'ai mentionné dans la section des commentaires, changez votre fonction en ceci:

public function scopeLock($query)
{
    return $query->where('locked', 0)->update(['locked' => 1]);
}

Notez les changements dans la méthode de mise à jour.

3
Jilson Thomas