如何在保存时获取Laravel中当前模型的id

时间:2015-05-26 17:43:06

标签: php laravel laravel-5

我在Laravel 5应用程序中工作。我尝试为项目保存评论,但我不知道如何获得 $ comment-> project_id 值。

这是我的简化控制器

public function store( CommentsFormRequest $request )
{
    $comment = new Note;
    $comment->message              = Input::get('message');
    $comment->project_id           = $note->project->id;
    $comment->user_id              = Auth::id();
    $comment->save();

    return Redirect::back();
}

这是我的简化表格

  {!! Form::open(array('route' => 'notes.store')) !!}

    {!! Form::textarea('message', '', array('placeholder'=>'Message')) !!}

  {!! Form::submit('Ajouter la note') !!}
  {!! Form::close() !!}

当我尝试保存时,我收到此错误:

Trying to get property of non-object

我想这是因为它试图获取新对象的sollicitation_id为null。我应该如何获得当前的project_id值?

更新

结论:我使用隐藏字段并遵循@tommy的推荐。 我的控制器现在使用

$note->project_id  = $request->input('project_id');

我的隐藏字段是

{!! Form::hidden('project_id', $project->id ) !!}

4 个答案:

答案 0 :(得分:1)

在store方法中,您尝试获取变量project的属性$note,该属性不存在。您应该将项目ID传递给store方法,方法是将其添加到路径或向表单添加隐藏字段project_id

然后,您的商店方法应如下所示:

public function store($project_id, CommentsFormRequest $request )
{
    $project = Project::find($project_id); // $project_id is transmitted over the URL

    $comment = new Note; // I'd alias Note as 'Comment', or rename '$comment' to '$note' because this can be confusing in the future
    $comment->project_id = $project->id;
    $comment->save();

    return Redirect::back();
}

如果要将带项目ID的隐藏字段添加到表单,可以通过调用$request->input('project_id');

来访问其值

答案 1 :(得分:1)

仅当表主列名称为'id'时

$model->id;

无论主列名称如何:

$model->getKey();

答案 2 :(得分:0)

我觉得上述答案远非完美,因为您不仅要向用户展示唯一身份证,而且还要长时间啰嗦,如果两个用户加载相同ID,则会失败页面同时,你应该做

public function store(CommentsFormRequest $request )
{
    $comment = new Note([
       // your fields here
    ]};
    $comment->save();
    //$comment now contains a unique ID!
    return redirect($comment->id);
}

答案 3 :(得分:0)

您可以使用insertGetId()查询构建器方法获取最后一个ID

  

如果表具有自动递增ID,请使用insertGetId方法插入记录,然后检索ID:

$id = DB::table('users')->insertGetId(
    ['email' => 'john@example.com', 'votes' => 0]
);

for more info check document