Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to post to two database tables from one form - Laravel 8

I am using Laravel 8 and trying to get an application form to post to two tables in my database

From my 2 database migration files:

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();
    });
}

Models:

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);
    }
}

Controllers:

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',
           ...
        ]);
    }
}

Requests:

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');

I am continually getting errors: The applicant id field is required. (If I make this field nullable the form does successfully post all other fields to the database.)

This is my first big Laravel project so any help would be greatly appreciated.

Update:

I have gone through the answers provided and am still getting the same error.

I feel the main issue is - when the form is filled out the applicant_id field for the newly created Applicant is not being captured and added to the applications table?

like image 984
LeanneB Avatar asked Dec 13 '25 12:12

LeanneB


2 Answers

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

like image 194
Prodipta Banerjee Avatar answered Dec 15 '25 06:12

Prodipta Banerjee


Remove use App\Http\Requests\Applicants\CreateApplicantRequest; from your ApplicationsController and run the following cmd commands:

composer dump-autoload

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

These commands clear all cache from your project.

Add nullable to your application migration applicant_id:

$table->integer('applicant_id')->nullable();
like image 43
Hedayatullah Sarwary Avatar answered Dec 15 '25 06:12

Hedayatullah Sarwary