尝试从一种形式发布到两个数据库表 - Laravel 8

Posted

技术标签:

【中文标题】尝试从一种形式发布到两个数据库表 - Laravel 8【英文标题】:Trying to post to two database tables from one form - Laravel 8 【发布时间】:2021-07-07 04:19:16 【问题描述】:

我正在使用 Laravel 8 并尝试将申请表发布到我的数据库中的两个表中

来自我的 2 个数据库迁移文件:

public function up() 
    Schema::create('applicants', function (Blueprint $table) 
        $table->id();
        $table->string('apptitle');
        $table->string('firstname');
        $table->string('middlename')->nullable();
        ...
        $table->timestamps();
    );

public function up() 
    Schema::create('applications', function (Blueprint $table) 
        $table->id();
        $table->integer('applicant_id'); 
        $table->integer('user_id');  
        $table->integer('loanAmount');
        $table->string('loanTerm');
        ...
        $table->timestamps();
    );

型号:

class Applicant extends Model 
    use HasFactory;

    protected $table = 'applicants';
    protected $fillable = [
        'apptitle', 'firstname', 'middlename'...
    ];

    public function application() 
        return $this->hasOne(Application::class);
            

class Application extends Model 
    use HasFactory;
    protected $table = 'applications';
    protected $fillable = [
        'applicant_id',
        'user_id',
        'loanAmount',
        'loanTerm',  
        ...
    ];

    public function applicant() 
        return $this->belongsTo(Applicant::class);
    

控制器:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests\Applicants\CreateApplicantRequest;

class ApplicantsController extends Controller 
    ...
    public function store(CreateApplicantRequest $request) 
        $applicant = Applicant::create([
            'apptitle' => $request->apptitle,
            'firstname' => $request->firstname,
            'middlename' => $request->middlename,
            ...
        ]);
    
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Application;
use App\Models\Applicant;
use App\Models\User;
use App\Http\Requests\Applications\CreateApplicationRequest;

class ApplicationsController extends Controller 
    ...
    public function store(CreateApplicationRequest $request) 
       $application = Application::create([
            'applicant_id' => $request->applicant_id,
            'user_id' => 'required',  
            'loanAmount' => 'required',
            'loanTerm' => 'required',
           ...
        ]);
    


请求:

public function rules() 
    return [
        'apptitle' => 'required',
        'firstname' => 'required',
        'middlename',
        ...
    ];

public function rules() 
    return [
        'applicant_id' => 'required',
        'user_id' => 'required',  
        'loanAmount' => 'required',
        'loanTerm' => 'required',
        ...
    ];

web.php

Route::get('applicants','ApplicantsController@store');
Route::resource('applications', 'ApplicationsController');
Route::get('applications/application', 'ApplicationsController@show');

我不断收到错误:申请人 ID 字段是必需的。 (如果我将此字段设为空,则表单会成功将所有其他字段发布到数据库。)

这是我的第一个大型 Laravel 项目,非常感谢任何帮助。

更新:

我已经查看了提供的答案,但仍然遇到同样的错误。

我觉得主要问题是 - 当填写表格时,新创建的申请人的 applicant_id 字段没有被捕获并添加到申请表中?

【问题讨论】:

欢迎来到 SO .. 你如何调用这两个控制器? 你能检查一下你在$request->applicant_id 中得到的值是多少,因为在你的迁移中applicant_id 列是not null。并请在模型中指定表名。 没有值被传递给申请者ID 从 ApplicationsController 中删除 use App\Http\Requests\Applicants\CreateApplicantRequest; 【参考方案1】:

You can store data from one form into 2 tables like this.

【讨论】:

这会替换单独的数据库请求文件吗?【参考方案2】:

删除使用 App\Http\Requests\Applicants\CreateApplicantRequest;从您的 ApplicationsController 并运行以下 cmd 命令:

composer dump-autoload

php artisan cache:clear
php artisan config:clear 
php artisan view:clear
php artisan route:clear

这些命令会清除项目中的所有缓存。

将 nullable 添加到您的应用程序迁移申请者 ID:

$table->integer('applicant_id')->nullable();

【讨论】:

我试过了,结果还是一样:-( 在您的申请迁移文件中,将申请者 ID 设为可为空:$table->integer('applicant_id')->nullable();【参考方案3】:

我终于能够将我的表单正确发布到两个数据库 - 非常感谢所有在此过程中帮助我的人。

这是我在 ApplicationsController 中更新的存储功能:

public function store(CreateApplicationRequest $request, Applicant $applicant)
            
    $applicant = Applicant::create([
        'apptitle' => $request->apptitle,
        'firstname' => $request->firstname,
        'middlename' => $request->middlename,
        ...
    ]);
    
    $application = $applicant->application()->create([
        'applicant_id' => $applicant->id,
        'user_id' => auth()->id(),
        'loanAmount' => $request->loanAmount,
        'loanTerm' => $request->loanTerm,
        ...
        ]); 
        
        

    // redirect the user

    return redirect(route('applications.index'));

我希望这个答案可以帮助别人!

【讨论】:

以上是关于尝试从一种形式发布到两个数据库表 - Laravel 8的主要内容,如果未能解决你的问题,请参考以下文章

将数据从一种形式传递到另一种形式的问题

如何在 Qt 中将数据从一种形式传递到另一种形式?

因为我可以从 jquery 将数据从一种形式发送到另一种形式?

从一种形式获取价值并将其传递给另一种形式

将数据从一种形式传递到另一种形式(datagridview)

MSoft Access - 将变量从一种形式传递到另一种形式