Laravel 的 Eloquent:无法编辑值

Laravel's Eloquent: can't edit values

我正在使用 Lumen,尝试编辑值,这是最简单的事情,但出于某种原因,更新后的值没有被保存

Task.php 型号

public function taskUsers()
{
    return $this->hasMany('App\Models\Tasks\UserTask')->where('role',1);
}

用户Task.php 模型什么都没有,一个空模型

class UserTask extends BaseModel { }

迁移

class CreateTasksTable extends Migration
{
    protected $table = 'tasks';
    protected $app_table = true;


    public function up()
    {
        Schema::create($this->getTable(), function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->dateTime('submit_date');
            $table->dateTime('closed_date')->nullable();
            $table->dateTime('due_date')->nullable();
            $table->tinyInteger('is_done')->nullable()->default(0);
            $table->integer('domain_id')->unsigned()->nullable();
            $table->foreign('domain_id')->references('id')
                ->on(self::getTableName('domains'))->onDelete('cascade');
            $table->bigInteger('created_by')->unsigned()->nullable();
            $table->foreign('created_by')->references('id')
                ->on(self::getTableName('auth_users', false))->onDelete('cascade');
            $table->bigInteger('closed_by')->unsigned()->nullable();
            $table->foreign('closed_by')->references('id')
                ->on(self::getTableName('auth_users', false))->onDelete('cascade');
            $table->timestamps();
        });

    }
    public function down()
    {
        Schema::drop($this->getTable());
    }
}

class CreateTaskUsersTable extends Migration
{
    protected $table = 'task_user';
    protected $app_table = true;
    public function up()
    {
        Schema::create($this->getTable(), function (Blueprint $table) {
            $table->increments('id');
            $table->integer('task_id')->unsigned()->nullable();
            $table->foreign('task_id')->references('id')
                ->on(self::getTableName('tasks'))
                ->onDelete('cascade');
            $table->bigInteger('user_id')->unsigned()->nullable();
            $table->foreign('user_id')->references('id')
                ->on(self::getTableName('auth_users', false))
                ->onDelete('cascade');
            $table->integer('role');
        });
    }
    public function down()
    {
        Schema::drop($this->getTable());
    }
}

比如编辑动作就这么简单,如果我只是想编辑标题,那不行,其他的都不编辑。

class EditTaskAction extends BaseAction
{
    protected $verbs = array('POST');
    protected $private = true;

    protected $inputRules = [
        'domain_id' => 'required',
        'task_id' => 'required',
        'title' => '',
        'due_date' => '',
        'assignee_id' => '',
        'is_done' => '',
        'role' => ''
    ];
    public function execute()
    {
        $title = $this->request->get('title');
        $dueDate = $this->request->get('due_date');
        $assigneeId = $this->request->get('assignee_id');
        $taskId = $this->request->get('task_id');
        $isDone = $this->request->get('is_done');
        $role = $this->request->get('role');
        $userId = \Auth::id();
        $domainId = $this->request->get('domain_id');
        \DB::beginTransaction();
        try {
            $task = Task::where('id', $taskId)
                ->where("domain_id", $domainId) ->first();
            $userTask = UserTask::where('task_id', $taskId)->first();

                if (isset($title) && !empty($title)) {
                    $task->title = $title;
                }
                if (isset($dueDate) && !empty($dueDate)) {
                    $task->due_date = $dueDate;
                }
                if (isset($assigneeId) && !empty($assigneeId)) {
                    $userTask->user_id = $userId;
                }
                if (isset($role) && !empty($role)) {
                    if ($role == TaskUserRole::ASSIGNEE) {
                        $userTask->role = $role;
                    }
                }

                if (isset($isDone) && !empty($isDone) ) {
                    if ($isDone == 0) {
                        $task->closed_by = null;
                        $task->closed_date = null;
                        $task->is_done = 0;
                    } else if ($isDone == 1) {
                        $task->closed_by = $userId;
                        $task->closed_date = Carbon::now();
                        $task->is_done = 1;
                    }
                }
                $task->save();
                $userTask->save();
                return $this->response->statusOk();

        } catch (\Exception $exception) {
            \DB::rollBack();
            \Log::error($exception);
            $this->response->addErrorDialog(self::SOMETHING_WENT_WRONG);
            return $this->response->statusFail(self::SOMETHING_WENT_WRONG);
        }
        \DB::commit();
    }
}

基本上都是我在做的

$task = Task::find($taskId); // I tried that too
$task->title = 'something';
$task->save();

没用

你在模型上设置了guarded属性吗?您可以通过将其设置为空数组来完全禁用保护。

protected $guarded = [];
// or check this:
protected $fillable = [...];

否则您可能会在日志中发现一些错误。

我认为你的模型有问题,你把你的数据存储在 fillable

我认为问题出在您的交易上。你用 \DB::beginTransaction(); 开始它但是 \DB::commit()(保存你对数据库的更改)永远不会是 运行,因为你之前做了 Return-Statements,比如 return $this->response->statusOk();

您可以尝试将您的响应保存到一个变量,并 return 它在 \DB::commit();

之后
class EditTaskAction extends BaseAction
{
    // ...
    public function execute()
    {
        // ...
        $response = null;
        \DB::beginTransaction();
        try {
            // ...
            $task->save();
            $userTask->save();
            $response = $this->response->statusOk();
        } catch (\Exception $exception) {
            // ...
            $response = $this->response->statusFail(self::SOMETHING_WENT_WRONG);
        }
        \DB::commit();
        return $response;
    }
}