Laravel 5.1 如何将对象的 id 传递给另一个视图以用作另一个表中的外键


Laravel 5.1 How to pass the id of an object to another view to be used as the foreign key in another table?

我有一个项目表和一个具有以下结构的引号表:

Schema::create('quotes', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('project_id')->index()->unsigned();
            $table->decimal('quote', 10,0);
            $table->timestamps();

在项目页面上,我需要一个链接,该链接指向用于创建新报价的页面。如何将项目的 ID 传递到报价单的创建视图?

更新

我尝试将项目 ID 闪烁到会话中,然后将其放入报价控制器中,但是当我尝试将其发送到那里时,会话已 emty!

//flashing project_id to the session
        $request->session()->flash('project_id', $project->id);
or
        $request->session()->flash('project_id', $project->id);
        $request->session()->reflash();
or
        $request->session()->flash('project_id', $project->id);
        $request->session()->keep(['project_id']);;
//getting it in quote controller
        $project_id=$request->session()->get('project_id');

问题出在哪里?

假设您有一个项目模型,并且$project是它的实例。获取项目的 ID 并将其传递给报价视图,如下所示:

$project_id = $project->id;
return redirect()->intended('your_view')->with('project_id' , $project_id);

$project_id存储在会话中。因此,您可以在边栏选项卡中轻松检索它,如下所示:

if(session()->has('project_id')){
    $project_id = session('project_id');
    // do whatever u want with the $project_id and set it in quote table
}

首先,您可以像这样定义资源丰富的路由:

Route::resource('projects.quotes', 'QuotesController');

现在,在您的项目页面中,将以下代码放在要显示链接以创建报价的位置:

{!! link_to_route('projects.quotes.create', 'Create Quote', $project->id) !!}

现在,修改报价控制器的创建函数,如下所示:

public function create($project_id)
{
    $project = App'Project::find($project_id);
    return view('quotes.create', compact('project'));
}

现在,您可以在创建.php或create.blade.php视图文件中使用$project数据

Laravel允许您在视图之间共享变量。您可以将其添加到现有AppServiceProvider或创建自己的。

在选定的服务提供商中:

public function boot()
{
    view()->share('username','Joe');
}

变量$username可用于所有视图。还可以在呈现视图之前从控制器或任何位置调用share方法。

View::share('key','value');

希望这个帮助

我找到了一个有效的解决方案。在项目控制器的 show 方法中,我使用 put() 方法将项目> id 切换到会话:

$request->session()->put('project_id', $project->id);

然后在报价控制器的创建方法中,我使用 pull() 方法将project_id从会话中取出。

$id=$request->session()->pull('project_id');

但是这种方法有一个小问题,如果用户决定刷新表单页面,会话中将没有project_id键。为了解决这个问题,我决定将用户重定向到项目列表以再次选择一个。