我有一个项目表和一个具有以下结构的引号表:
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键。为了解决这个问题,我决定将用户重定向到项目列表以再次选择一个。