【问题标题】:Laravel Eloquent cannot insert to databaseLaravel Eloquent 无法插入数据库
【发布时间】:2019-05-25 23:34:28
【问题描述】:

我正在使用 Laravel 5.7 制作一个像谷歌表单一样运行的应用程序。这是我已经制作的表格:

我制作了一个雄辩的模型,以便个人详细信息表中的每个名称都有一个包含所有这些表的记录,并在单击提交按钮后将填充的表插入数据库。问题是,它没有成功插入数据库。我不知道是什么问题,这是我的代码:

PersonalDetails.php(雄辩模型)

namespace App;

use Illuminate\Database\Eloquent\Model;

class PersonalDetails extends Model
{
    protected $table = 'personal_details';
    protected $guarded = ['id'];

public function accomodation()
{
    return $this->hasOne('App\Accomodation');
}

public function course()
{
    return $this->hasOne('App\Course');
}

public function proposedStudy()
{
    return $this->hasOne('App\ProposedStudy');
}

public function emergencyContact()
{
    return $this->hasOne('App\EmergencyContact');
}

public function englishTestResult()
{
    return $this->hasOne('App\EnglishTestResult');
}

public function homeInstitution()
{
    return $this->hasOne('App\HomeInstitution');
}

public function insurance()
{
    return $this->hasOne('App\Insurance');
}
}

FormController.php

public function submit(Request $request) {

    $request->validate([
        // Personal Details
        'fullname' => 'required|string',
        'nationality' => 'required|string',
        'date_of_birth' => 'required|string',
        'passport_number' => 'required|string',
        'issuing_country' => 'required|string',
        'date_of_issue' => 'required|string',
        'date_of_expiry' => 'required|string',
        'blood_type' => 'required|string',
        'marital_status' => 'required|string',
        'address' => 'required|string',
        'city' => 'required|string',
        'postal_code' => 'required|numeric',
        'province' => 'required|string',
        'country' => 'required|string',
        'phone' => 'required|string',
        'mobile' => 'required|string',
        'email' => 'required|email',
        'address2' => 'nullable|text',
        'city2' => 'nullable|string',
        'postal_code2' => 'nullable|numeric',
        'province2' => 'nullable|string',
        'country2' => 'nullable|string',
        'phone2' => 'nullable|string',
        'contact_name' => 'required|string',

        // Home Institution
        'name' => 'required|string',
        'address' => 'required|string',
        'phone' => 'required|string',
        'email' => 'required|email',
        'website' => 'required|string',
        'faculty_dep' => 'required|string',
        'start_year' => 'required|string',
        'gpa' => 'required|string',

        // Proposed Study
        'semester' => 'required|in:Semester I (Aug-Jan),Semester II (Feb-Jun)',
        'academic_year' => 'required|string',
        'faculty' => 'required|string',
        'department' => 'required|string',
        'study_period' => 'required|string',
        'start_date' => 'required|string',
        'end_date' => 'required|string',
        // Course
        'course_title' => 'required|string',
        'credit' => 'required|string',

        // English Test Result
        'test' => 'required|string',
        'score' => 'required|numeric',
        'test_center' => 'required|string',  
        'date_tested' => 'required|string',

        // Insurance
        'insurance_name' => 'required|string',
        'validity' => 'required|string',
        'cover' => 'required|string',

        // Accomodation
        'accomodation_help' => 'required|in:YES,NO',
        'adress' => 'required|string',
        'contact_person' => 'required|string',

        // Contact of Emergency
        'fullname' => 'required|string',
        'relationship' => 'required|string',
        'address' => 'required|string',
        'phone' => 'required|string',
        'mobile' => 'required|string',
        'email' => 'required|email',


    ]);

    PersonalDetails::create([
        'fullname' => $request->input('name'),
        'nationality' => $request->input('nationality'),
        'date_of_birth' => $request->input('dob'),
        'passport_number' => $request->input('passport'),
        'issuing_country' => $request->input('is_country'),
        'date_of_issue' => $request->input('doi'),
        'date_of_expiry' => $request->input('doe'),
        'blood_type' => $request->input('blood'),
        'marital_status' => $request->input('maritial'),
        'address' => $request->input('address'),
        'city' => $request->input('city'),
        'postal_code' => $request->input('postal'),
        'province' => $request->input('state'),
        'country' => $request->input('country'),
        'phone' => $request->input('phone'),
        'mobile' => $request->input('mobile'),
        'email' => $request->input('email'),
        'address2' => $request->input('address2'),
        'city2' => $request->input('city2'),
        'postal_code2' => $request->input('postal2'),
        'province2' => $request->input('state2'),
        'country2' => $request->input('country2'),
        'phone2' => $request->input('phone2'),
        'contact_name' => $request->input('contact_name'),
    ]);

    HomeInstitution::create([
        'name' =>  $request->input('institution'),
        'address' =>  $request->input('i_address'),
        'phone' =>  $request->input('i_phone'),
        'email' =>  $request->input('i_email'),
        'website' =>  $request->input('web'),
        'faculty_dep' =>  $request->input('faculty_dept'),
        'start_year' =>  $request->input('s_year'),
        'gpa' =>  $request->input('gpa'),
    ]);

    ProposedStudy::create([
        'semester' => $request->input('duration'),
        'academic_year' => $request->input('f_year') . '/' . $request->input('l_year'),
        'faculty' => $request->input('faculty'),
        'department' => $request->input('department'),
        'study_period' => $request->input('spesific_period'),
        'start_date' => $request->input('start_date'),
        'end_date' => $request->input('end_date'),
    ]);

    Course::create([
        'course_title' => $request->input('course_1'),
        'credit' => $request->input('credit_1'),
    ]);

    EnglishTestResult::create([
        'test' => $request->input('toefl'),
        'score' => $request->input('score_toefl'),
        'test_center' => $request->input('place_toefl'),     
        'date_tested' => $request->input('date_toefl'),
    ]);

    Insurance::create([
        'insurance_name' => $request->input('insurance'),
        'validity' => $request->input('valid_date'),
        'cover' => $request->input('cover'),
    ]);

    Accomodation::create([
        'accomodation_help' => $request->input('opt_acc'),
        'adress' => $request->input('adress_acc'),
        'contact_person' => $request->input('cp_acc'),
    ]);

    EmergencyContact::create([
        'fullname' => $request->input('emergency_name'),
        'relationship' => $request->input('relationship'),
        'address' => $request->input('address_emergency'),
        'phone' => $request->input('emergency_phone'),
        'mobile' => $request->input('emergency_mobile'),
        'email' => $request->input('emergency_email'),
    ]);

    // return back()-> with('success', 'Berhasil submit!');
}

【问题讨论】:

  • 任何错误信息?
  • 不,先生,它没有错误消息。我不知道是什么问题
  • 您能否检查浏览器控制台 -> 网络选项卡中的响应代码(200 或 404 或 422)。我猜一些验证失败
  • 我认为你有批量分配问题。您可以在模型中添加可填充变量。你可以在这里查看laravel.com/docs/5.7/eloquent#mass-assignment,你应该把所有的验证放在一个单独的请求文件中。我知道这与您的问题无关,但它会使您的控制器变薄。 laravel.com/docs/5.7/requests希望对你有帮助:)
  • 我猜可能是验证失败。只需检查您所有的Form Fieldsfields under validation。字段可能不匹配。

标签: php laravel eloquent


【解决方案1】:

经过所有这些努力找出问题后,我才意识到我在验证规则中输入了错误的名称。验证规则左侧的名称与html中的名称不同,因此我对html中的名称和验证规则进行了修改。

重要的是我在提交后没有输入任何验证错误消息,因此它不会插入到数据库中。在我输入一些错误消息后,所有字段都返回错误,显示“需要 :attribute”。只是因为验证中的名称与html名称不同:D

谢谢大家帮我解决问题,我解决了:))

【讨论】:

    【解决方案2】:

    尝试使用模型路径,如果模型文件夹在 App 中,则 App\model;

    eg:-
    App\Insurance::create([
            'insurance_name' => $request->input('insurance'),
            'validity' => $request->input('valid_date'),
            'cover' => $request->input('cover'),
        ]);
    

    【讨论】:

      【解决方案3】:

      在模型中添加$fillalbe

      protected $fillable=['full_name','nationality','...']
      

      您需要在模型上指定fillalbe 属性。阅读更多https://laravel.com/docs/5.7/eloquent#mass-assignment

      【讨论】:

      • 如果指定了$guarded 属性,则不需要这样做。 While $fillable serves as a "white list" of attributes that should be mass assignable, you may also choose to use $guarded. The $guarded property should contain an array of attributes that you do not want to be mass assignable. All other attributes not in the array will be mass assignable.
      • 同意 Jeremy,我认为如果我已经附加了除 $guarded 之外的受保护数组,它将是 $fillable 列表
      • 尝试插入静态值。
      • 然后尝试添加$fillable并删除$guarded
      • 转储request时得到的结果
      【解决方案4】:

      您能否检查您的表迁移或模型关系,然后修改您的表单控制器。

      我正在根据您的代码创建示例并成功插入数据库。

      个人资料迁移

      Schema::create('personal_details', function (Blueprint $table) {
              $table->increments('id');
              $table->string('fullname')->nullable();
              $table->string('nationality')->nullable();
              $table->timestamps();
          });
      

      家庭机构迁移

      Schema::create('home_institution', function (Blueprint $table) {
              $table->integer('personal_details_id')->unsigned()->primary();
              $table->string('name')->nullable();
              $table->string('address')->nullable();
              $table->timestamps();
      
              #Foreign to Table Personal Details.
              $table->foreign('personal_details_id')->references('id')->on('personal_details')->onUpdate('cascade')
                  ->onDelete('cascade');
      
          });
      

      个人细节模型关系

      <?php
      
      namespace App;
      
      use Illuminate\Database\Eloquent\Model;
      
      class PersonalDetails extends Model
      {
      protected $guarded = ['id'];
      
      
      public function homeInstitution()
      {
          return $this->hasOne('App\HomeInstitution');
      }
      
      # Other your Relation
      
      }
      

      表单控制器

      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      use App\PersonalDetails;
      
      class FormController extends Controller
      {
      public function index()
      {
          return view('form.index');
      }
      
      public function submit(Request $request)
      {
          $request->validate([
              // Personal Details
              'fullname' => 'required|string',
              'nationality' => 'required|string',
              // Home Institution
              'name' => 'required|string',
              'address' => 'required|string',
          ]);
      
          $pd = PersonalDetails::create(
              ['fullname' => $request->get('fullname'), 'nationality' => $request->get('nationality')]
          );
      
          # Insert into HomeInstitution => base on Model Relation from PersonalDetails
          $pd->homeinstitution()->create(
              ['name' => $request->get('name'), 'address' => $request->get('address')]
          );
      
          # Insert into other youR relation
          /*$pd->example()->create(
              []
          );*/
      
      
          return dd('Successfull Insert');
      }
      }
      

      也许它可以帮助你。

      【讨论】:

        猜你喜欢
        • 2019-06-24
        • 2015-09-19
        • 2015-02-22
        • 2014-11-02
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2014-05-19
        相关资源
        最近更新 更多