2016-06-07 8 views
1

Ich benutze PHP, Laravel 5.2 und MySQL.Objekt mit Fremdschlüsseln in Laravel speichern

Während der Benutzerregistrierung muss ich einen neuen Patienten erstellen. Aber Patient hat Benutzer-ID, Kontakt-ID und Wächter-ID (Fremdschlüssel).

Wenn ich versuche,(), um den Patienten zu retten, erhalte ich die folgende Ausnahme:

SQLSTATE [42S22]: Column nicht gefunden: 1054 Unknown column 'patient_id' in 'Feldliste' (SQL: aktualisieren users gesetzt patient_id = 0, updated_at = 2016.06.07 00.59.35 wo id = 6)

Das Problem ist, dass ich nicht patient_id Spalte verfügen. Stattdessen habe ich patientId.

Ich weiß nicht, wie Sie dieses Problem beheben können. Jede Hilfe wird geschätzt. Ich kann die Migrationsdateien einbeziehen, wenn dies wichtig ist.

UserController.php

public function postSignUp(Request $request) 
{ 
    $this->validate($request,[ 
     'email' => 'required|email|unique:users', 
     'name' => 'required|max:100', 
     'password' => 'required|min:6' 
    ]); 


    $guardian = new Guardian(); 
    $guardian->guardianId = Uuid::generate();; 
    $guardian->save(); 

    $contact = new Contact(); 
    $contact->contactId = Uuid::generate(); 
    $contact->save(); 

    $user = new User(); 
    $user->email = $request['email']; 
    $user->name = $request['name']; 
    $user->password = bcrypt($request['password']); 
    $user->save(); 


    $patient = new Patient(); 
    $patient->patientId = (string)Uuid::generate(); 
    $patient->user()->save($user); 
    $patient->contact()->save($contact); 
    $patient->guardian()->save(guardian); 



    $patient->save(); 
    Auth::login($user); 

//  return redirect()->route('dashboard'); 
} 

Patient.php

class Patient extends Model 
{ 
    protected $primaryKey='patientId'; 
    public $incrementing = 'false'; 
    public $timestamps = true; 

    public function user() 
    { 
     return $this->hasOne('App\User'); 
    } 
    public function contact() 
    { 
     return $this->hasOne('App\Contact'); 
    } 
    public function guardian() 
    { 
     return $this->hasOne('App\Guardian'); 
    } 
    public function allergies() 
    { 
     return $this->belongsToMany('App\PatientToAllergyAlert'); 
    } 
    public function medicalAlerts() 
    { 
     return $this->belongsToMany('App\PatientToMedicalAlert'); 
    } 
} 

User.php

class User extends Authenticatable 
{ 
    protected $fillable = [ 
     'name', 'email', 'password', 
    ]; 
    protected $hidden = [ 
     'password', 'remember_token', 
    ]; 
    public function patient() 
    { 
     return $this->belongsTo('App\Patient'); 
    } 
} 

contact.php

class Contact extends Model 
{ 
    protected $table = 'contacts'; 
    protected $primaryKey = 'contactId'; 
    public $timestamps = true; 
    public $incrementing = 'false'; 

    public function contact() 
    { 
     return $this->belongsTo('App\Patient'); 
    } 
} 

Guardian.php

class Guardian extends Model 
{ 
    protected $table = 'guardians'; 
    protected $primaryKey = 'guardianId'; 
    public $timestamps = true; 
    public $incrementing = 'false'; 

    public function contact() 
    { 
     return $this->belongsTo('App\Patient'); 
    } 
} 

Antwort

4

Sie haben keine Beziehungen richtig definiert. Füllen Sie zunächst Tabellenfelder in $ befüllbares Array in Patienten-, Kontakt-, Guardian-Klassen aus (genau wie in der Benutzerklasse).

Wenn Sie die hasOne-Beziehung zwischen Patient und Benutzer verwenden möchten, benötigen Sie das Feld user_id auf der Patienten-Tabelle. Sie können alternativ auch die angleTo-Beziehung verwenden.

Wenn Sie benutzerdefinierte Spaltennamen verwenden möchten, geben Sie sie nur in Beziehung Methoden:

public function user() 
{ 
    return $this->hasOne('App\User', 'id', 'user_id'); 
    // alternatively 
    return $this->belongsTo('App\User', 'user_id', 'id'); 
} 

Nur durch Dokumentation ohne Überspringen Absätze und Sie werden in wenigen Minuten loslegen :) https://laravel.com/docs/5.1/eloquent-relationships#defining-relationships

auch das wird nicht funktionieren:

$patient = new Patient(); 
$patient->patientId = (string)Uuid::generate(); 
$patient->user()->save($user); 

neue Patienten() erzeugt nur das Objekt, es aber nicht speichern in DB, so dass Sie keine Beziehungen speichern können.Sie müssen das Objekt erstellen und speichern Sie es an die DB, dieses Problem zu vermeiden:

$patient = Patient::create(['patientId' => (string)Uuid::generate()]); 
$patient->user()->save($user); 
... 

// or 
$patient = new Patient(); 
$patient->patientId = (string)Uuid::generate(); 
$patient->save(); 
$patient->user()->save($user); 
... 
+0

danke für deine zeit ... ich werde versuchen, die änderungen jetzt vorzunehmen – dimitrisdan

0

Wenn Sie Ihre Beziehung sind eingerichtet haben, können Sie den Namen des Primärschlüssels in dem anderen Modell angeben. Schauen Sie here.

Ich bin mir nicht sicher, aber ich denke, Sie Beziehungen sind nicht richtig definiert.

Verwandte Themen