wake-up-neo.net

Laravel 5.5 Das Speichern von Methoden ist beim Aktualisieren von Einträgen mit geändertem Primärschlüssel nicht möglich

Ich arbeite mit laravel 5.5, um Einträge zu aktualisieren. Das Problem ist nach dem Ändern des Primärschlüssels 'id', der standardmäßig in 'project_id' geändert wird. Das Hinzufügen eines Elements funktioniert, aber das Aktualisieren eines Elements funktioniert nicht richtig. Hier ist der Fehler, den ich erhalte.

Methode save existiert nicht.

Hier ist mein Model.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Project extends Model
{
   protected $primaryKey = 'project_id';
    public function user()
    {
        return $this->belongsTo(User::class);
    }
    public function tasks()
    {
        return $this->hasMany(Task::class);
    }
}

Hier ist meine Controller-Funktion.

public function editProject($id){

        $project = Project::where('project_id', $id)->firstOrFail();
        $data = ["project_info" => $project];
        return view('projects.edit')->with($data);
    }
    public function updateProject(Request $request){
        $data = $request->all();
        $validator = Validator::make($data, [
            'project_title' => 'required',
            'project_description' => 'required',
            'project_start_date' => 'required',
            'project_end_date' => 'required',
            'project_status' => 'required',
        ]);

        $response = [];

        if ($validator->fails()){
            $response["errors"] = [$validator->messages()->first()];
            $response["success"] = false;
            return json_encode($response);
        }

        else{
            $project = Project::where("project_id", $request->input('project_id'))->get();
            $project->project_title = $request->project_title;
            $project->user_id = Session::get('user_id');
            $project->project_description = $request->project_description;
            $project->project_start_date = $request->project_start_date;
            $project->project_end_date = $request->project_end_date;
            $project->project_status = $request->project_status;
            $project->save();
            return redirect('/listProjects');
        }
    }
10

Mit get() wird ein collection zurückgegeben. Obwohl Sie eine 'eindeutige' ID, den project_id, Übergeben, wird dennoch eine Sammlung zurückgegeben - die Sammlung enthält lediglich ein Element.

In der Folge wird Ihr Code nicht so funktionieren, wie Sie es erlebt haben, oder zumindest nicht ohne einige Änderungen, damit $project Auf das erste Element in der Auflistung verweist.

Es ist jedoch eine schnelle Lösung, ändern Sie einfach Folgendes:

$project = Project::where("project_id", $request->input('project_id'))->get();

dazu:

$project = Project::where("project_id", $request->input('project_id'))->first();

Mit first() gibt eloquent das erste Element zurück, das der Abfrage entspricht, und gibt das Element tatsächlich zurück (im Gegensatz zu einer Sammlung mit einem Element), sodass Sie es direkt bearbeiten und speichern können.

24
James

Hier ist die Lösung, die ich gefunden habe.

$project_id = $request->input('project_id');
$project = Project::find($project_id);
$project->save();
1

Sie finden es anhand der ID mit

Project::find($id);

Oder holen Sie sich das erste Element, wie James sagte:

$project = Project::where("project_id", $request->input('project_id'))->first();
1
Thiago Maciel