2016-07-05 4 views
0

Ich versuche, Formulardetails in meine Datenbank durch einen Controller zu speichern. Wenn ich einreichen klicken, bin ich diesen Fehler angezeigt:Laravel - Aufruf an eine Elementfunktion create() bei null

in ClinicController.php line 58 at ClinicController->store(object(Request))

Linie 58 (siehe unten für die gesamte Funktion) ist:

$request->user()->create([ 

Controller:

public function store(Request $request) 
{ 

    $request->user()->create([ 
     'name' => $request->name, 
     'email' => $request->email, 
     'password' => $request->password 
    ]); 

    $request->user()->clinic()->create([ 
     'clinic_name' => $request->clinic_name, 
     'telephone' => $request->telephone, 
     'address_1' => $request->address_1, 
     'address_2' => $request->address_2, 
     'city' => $request->city, 
     'postcode' => $request->postcode 
    ]); 

    return redirect('/home'); 

} 

Benutzer Modell:

public function clinic() { 
    return $this->belongsTo(Clinic::class); 
} 

Klinik Modell:

public function user() { 
    return $this->belongsTo(User::class); 
} 

routes.php:

Route::post('/clinic', '[email protected]'); 

Jede mögliche Hilfe würde sehr groß geschätzt. Danke vielmals.

+0

Ich wurde nach Laravel Vorbild auf ihrer Website - es scheint, von dem Hinzufügen von Daten über einen Controller eine gültige Art und Weise zu sein - https://laravel.com/docs/5.2/quickstart-intermediate#introduction. – Ben

+0

Wenn Sie versuchen, Methode auf null aufzurufen, gibt '$ request-> user() 'null zurück, was bedeutet, dass kein angemeldeter Benutzer oder eine fehlende Web-Middleware vorhanden ist. @chasenyc, ja '$ request-> user()' ist eine Sache. – lagbox

Antwort

0

Wenn Sie die aktuell autorisierten Benutzer möchten, nur app()->user() verwenden. Außerdem können Sie einen Großteil Ihrer Logik vereinfachen und viel einfacher lesen.

auth() 
->user() 
->create($request->only([ 
    'name', 
    'email', 
    'password' 
])) 
->clinic() 
->create($request->only([ 
    'clinic_name', 
    'telephone', 
    'address_1', 
    'address_2', 
    'city', 
    'postcode' 
])); 

return redirect('/home'); 
+0

Vielen Dank für Ihre Antwort. Ihr Beispiel entfernt meinen Benutzer() -> clinic(), der in Laravels eigenem Beispiel automatisch den Fremdschlüssel hinzufügt. Wie kann ich das bitte in Ihrem Beispiel machen? – Ben

+0

@Ben Hallo Ben! Es entfernt es nicht, es wird es tatsächlich von der app() -> user() -> create() 'ketten, da die' create() 'Methode eine Instanz des neuen' Model' zurückgibt. Hoffnung, die Dinge aufräumt! – Ohgodwhy

+0

Hallo Ohgodwhy, das war sehr praktisch! Ich habe noch nie so eine Art Laravel hinzugefügt. Sehr informativ. Nachdem ich Ihren Code hinzugefügt habe, wird mir nun der folgende Fehler angezeigt: Aufruf an undefinierte Methode Illuminate \ Foundation \ Application :: user() '. Ihre Hilfe würde sehr geschätzt werden. Danke vielmals. – Ben

0

ändern Controller dazu:

public function store(Request $request) 
{ 

    App\User::create([ 
     'name' => $request->name, 
     'email' => $request->email, 
     'password' => $request->password 
    ]); 

    App\Clinic::create([ 
     'clinic_name' => $request->clinic_name, 
     'telephone' => $request->telephone, 
     'address_1' => $request->address_1, 
     'address_2' => $request->address_2, 
     'city' => $request->city, 
     'postcode' => $request->postcode 
    ]); 

    return redirect('/home'); 

} 
+0

Vielen Dank für Ihre Antwort. Ich folgte tatsächlich Laravels eigenem Beispiel - https://laravel.com/docs/5.2/quickstart-intermediate#introduction - und unter Verwendung von: 'user() -> clinic() -> create' wurde erwähnt, dass dies der Fall wäre Behandeln Sie die Implementierung des Fremdschlüssels. Wie kann ich dies mit Ihrer Methode erreichen? Danke vielmals. – Ben

+0

Werfen Sie einen Blick auf @ Ohgodwhy Antwort –

0

Ich denke, Probleme mit $ füllbare Eigenschaft, stellen Sie sicher, es zu überprüfen.

1
public function store(Request $request) 
{ 
    $user = App\User::create([ 
     'name' => $request->name, 
     'email' => $request->email, 
     'password' => $request->password 
    ]); 

    $clinic = App\Clinic::create([ 
     'clinic_name' => $request->clinic_name, 
     'telephone' => $request->telephone, 
     'address_1' => $request->address_1, 
     'address_2' => $request->address_2, 
     'city' => $request->city, 
     'postcode' => $request->postcode 
    ]) 

    $user->clinics()->attach($clinic->id); 

    return redirect('/home'); 
} 
Verwandte Themen