Laravel-Modell speichert Daten ohne Primärschlüssel

Lesezeit: 4 Minuten

Ich habe 2 Modelle: Profile und Student. Das Profil enthält einen Primärschlüssel, Ich würde. Das Studentenmodell hat keinen Primärschlüssel, sondern einen Fremdschlüssel, Profil ID, die auf profile.id verweist. Ich habe eine Funktion in meinem Student-Controller, die den Student aktiviert und den Status von 0 auf 1 setzt, wenn er aufgerufen wird. Ich versuche, save () für die Aktualisierung des Werts zu verwenden, kann dies jedoch nicht tun und erhalte eine solche Meldung:

Column not found: 1054 Unknown column 'id' in 'where clause'

Können Sie bitte beraten? Vielen Dank.

Studentenmodell:

class Student extends Eloquent {

    protected $primary_key = null;
    public $incrementing = false;

    protected $fillable = array('username', 'password', 'status', 'profile_id');

    public function profile() {
        return $this->belongsTo('Profile');
    }
}

Profilmodell:

class Profile extends Eloquent {

    protected $fillable = array('firstname', 'lastname', 'email', 'phone');

    public function student()
    {
        return $this->hasOne('Student', 'profile_id', 'id');
    }
}

StudentController:

public function activate($id) {
        $student = Student::where('profile_id', '=', $id)->first();
        $student->status = 1;
        $student->save();
        return Redirect::to('students');
}

  • Warum willst du damit arbeiten? Eloquent wird sowieso nicht, da es auf den Primärschlüssel ankommt (wie jedes ORM).

    – Jarek Tkaczyk

    21. August 2014 um 18:19 Uhr

  • Sieh dir das an coderwall.com/p/lhfzia

    – Schwarzbischof

    21. August 2014 um 18:23 Uhr

Benutzer-Avatar
c-Greif

Vielleicht möchten Sie erwägen, eine hinzuzufügen id aufstellen. Es ist ziemlich wichtig für Laravel und Pakete (insbesondere für die Aggregation)

aber wenn es sein muss…

Studentenmodell: (Kamelfall primaryKey Eigentum)

class Student extends Eloquent {

    protected $primaryKey = null;
    public $incrementing = false;


    protected $fillable = array('username', 'password', 'status', 'profile_id');

    public function profile() {
        return $this->belongsTo('Profile');
    }
}

  • Ich denke, Sie haben Recht mit dem “primaryKey”, aber als ich versuchte, ihn im Code zu ändern, bekam ich stattdessen ein Ladeproblem beim Aufrufen der Funktion. Ich bin mir nicht sicher, ob es wirklich so ist, dass ich definitiv ein ID-Feld zum Arbeiten benötige, obwohl es in meinem Fall keinen Zweck erfüllt, sondern nur die Anforderung erfüllt, einen Primärschlüssel zu benötigen.

    – J L.

    21. August 2014 um 18:39 Uhr

  • Was ist das Ladeproblem, das Sie nach dem Ändern des Eigenschaftsnamens haben? Zweifellos können Sie diese Tabelle mit Laravel und ohne Primärschlüssel verwenden, aber es kann zunehmend schwierig werden, wenn Sie versuchen, andere Pakete zu integrieren: Cruddy zum Beispiel. Hinzufügen eines primary key kann Ihnen später einige Kopfschmerzen ersparen, und ich kann mir keinen Fall vorstellen, in dem es kostspielig wäre.

    – c-Greif

    21. August 2014 um 18:54 Uhr

  • Beachten Sie, dass die offizielle Dokumentation einen solchen Fall nicht erwähnt und aus einigen Gründen zu unerwarteten Fehlern führen kann, die schwer zu lokalisieren und zu debuggen sind Ich empfehle jedem dringend, dies nicht zu tun!

    – Buschikot

    31. August 2016 um 7:52 Uhr

  • Diese Einstellung kann ich bestätigen $primaryKey zu null bringt Laravel nur dazu, zu explodieren und einen weißen Bildschirm des Todes mit absolut keiner Protokollierung zu zeigen, jedes Mal, wenn ein Update versucht wird. Dies funktioniert für Einfügungen, aber nicht für Aktualisierungen.

    – Skeets

    12. Oktober 2017 um 20:57 Uhr


  • Bestätigt, Sachen, die super einfach sind, wenn man direkt mit db arbeitet, sind in Laravel super-duper kompliziert. Laravel BRAUCHT Primärschlüssel. Ohne sie bricht das gesamte Framework dumm zusammen und ist völlig nutzlos. Entwerfen Sie Ihre DB also mit Primärschlüsseln oder verwenden Sie ein anderes Framework, da Laravel für Sie nutzlos ist.

    – Jeffz

    20. Februar 2018 um 1:49 Uhr


Ich hatte das gleiche Problem und konnte kein Primärschlüsselfeld für diese Tabelle verwenden.

Da Eloquent solche Tabellen nicht aktualisieren kann, habe ich es gelöst, indem ich einfach entschieden habe, die Zeile auf andere Weise zu aktualisieren:

NameOfMyTable::where('entity_type', 1)->update(['last_import' => Carbon::now()]);

Benutzer-Avatar
mushood badulla

Wenn jemand das gleiche Problem hat, habe ich die Antwort von Nishchit Dhanani verwendet und es hat ziemlich gut funktioniert:

Schreiben Sie diese Zeile in Ihr Modell:

public $primaryKey = '_id';

Wo _id ist Ihr manueller Primärschlüssel.

Für meinen Fall hatte ich eine Benutzertabelle und ein Teil meiner Benutzer sind Studenten. Der Primärschlüssel in meiner Schülertabelle war also “user_id”, und ich habe diese Zeile in meiner hinzugefügt Student Modell:

public $primaryKey = 'user_id';

Ich konnte die verwenden save() -Methode beim Aktualisieren meines Studentenobjekts.

In Ihrem Fall müssten Sie dies nur zu Ihrem Studentenmodell hinzufügen:

public $primaryKey = 'profile_id';

1091730cookie-checkLaravel-Modell speichert Daten ohne Primärschlüssel

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy