如何建立对外关系?

时间:2014-08-17 10:13:10

标签: php mysql laravel-4

我是Laravel的新手。我正在使用laravel4开发一个网站,这将成为一个关于Laravel的外键关系的一个非常基本的问题。我正在努力设置外键。我的问题的解释如下。请在这里看看。

我正在开发一个有两个基本部分的网站。

1.Blood Donation
2.Matrimonial 

我网站的基本映射是这样的。它是

- >首先,用户将再次注册名称,电子邮件,密码和密码等基本信息

- >然后用户将登录。示例用户以Robert Moore身份登录。

- >在登录为Robert Moore后,用户将获得两个链接(1.Blood捐赠表格2.婚姻表格)

- >那么用户希望他/她是否将自己注册为献血者或婚姻或两者兼而有之。

现在登录后,如果用户(Robert Moore)选择献血表格或想成为献血者,那么我之前说过,他/她会提供一份表格。强>献血形式。表格就是这样。

<form class="form-horizontal" role="form" action="{{URL::route('blood-donation-post')}}" method="post">          <div "form-group">
                     <label for="inputEmail3" class="col-sm-4 control-label">Date of Birth</label>
                     <input type="date" class="form-control" id="inputEmail3" placeholder="Age" name='date_of_birth'{{(Input::old('age')) ? ' value="'.e(Input::old('age')).'"' : ''}}>
                       @if($errors->has('date_of_birth'))
                        <span style="color:red">{{$errors->first('date_of_birth')}}</span>
                       @endif
                    </div>

                  <div class="form-group">
                    <label for="inputEmail3" class="col-sm-4 control-label">Blood Group</label>
                      <select class="form-control" name='blood_group'>
                        <option>You Must Select your Blood Group</option>
                          <option>O-</option>
                          <option>O+</option>
                          <option>A-</option>
                          <option>A+</option>
                          <option>B-</option>
                          <option>B+</option>
                          <option>AB-</option>
                          <option>AB+</option>
                      </select>
                        @if($errors->has('blood_group'))
                         <span style="color:red">{{$errors->first('blood_group')}}</span>
                        @endif
                  </div>

                    <div class="form-group">
                      <label for="inputEmail3" class="col-sm-4 control-label">Location</label>
                       <select class="form-control" name='location'>
                          <option> You Must Select a Location</option>
                          <option>MAGURA</option>
                          <option>MEHERPUR</option>
                          <option>NARAIL</option>
                          <option>SATKHIRA</option>
                          <option>BOGRA</option>
                          <option>CHAPAINABABGANJ</option>
                          <option>JOYPURHAT</option>
                          <option>PABNA</option>
                        </select>
                       @if($errors->has('location'))
                         <span style="color:red">{{$errors->first('location')}}</span>
                       @endif
                    </div>

                  <div class="form-group">
                    <label for="inputEmail3" class="col-sm-4 control-label">Phone Number</label>
                     <input type="text" class="form-control" id="inputEmail3" placeholder="Phone Number" name='phone_number'{{(Input::old('phone_number')) ? ' value="'.e(Input::old('phone_number')).'"' : ''}}>
                       @if($errors->has('phone_number'))
                        <span style="color:red">{{$errors->first('phone_number')}}</span>
                       @endif
                  </div>

                  <div class="form-group">
                    <label for="inputEmail3" class="col-sm-4 control-label">Last Date of Blood Donation</label>
                     <input type="date" class="form-control" id="inputEmail3" placeholder="Last Date of Blood Donation" name='last_date_of_donation'{{(Input::old('last_date_of_donation')) ? ' value="'.e(Input::old('last_date_of_donation')).'"' : ''}}>
                     @if($errors->has('last_date_of_donation'))
                      <span style="color:red">{{$errors->first('last_date_of_donation')}}</span>
                     @endif
                  </div>
                  <div style="padding-left:20%">
                    <button type="submit" class="btn btn-default ">Submit</button>
                    {{ Form::token() }}
                  </div>
</form>

虽然用户签名为Robert Moore(例如),但如果他想成为献血者,他将只需要提供与献血相关的信息接受他的姓名,电子邮件,因为这些信息已经存储当他注册时,在用户表中。这就是为什么我在献血表(上面给出)中提供与献血相关的字段名称,电子邮件除外。现在这些提交的数据将存储在捐赠者表中。

现在,在这里,我通过外键在用户表和捐赠者表之间建立一对一关系因为登录的用户也是实际上是献血者的用户。现在我将向您展示关于捐赠者模型的迁移文件,其中我与用户<建立了外键关系/ strong> model.here是迁移文件(部分),

 Schema::create('donors', function(Blueprint $table)
    {
        $table->increments('id');
        //$table->increments('donor_id');
        $table->unsignedInteger('donor_id');
        $table->foreign('donor_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
        $table->string('blood_group');
        $table->string('phone_number')->unique();
        $table->string('location');
        $table->date('date_of_birth');
        $table->date('last_date_of_donation');
        $table->timestamps();
    });

但在提交献血表(上面给出)之后,我面临着类似的例外情况,

Illuminate \ Database \ QueryException

SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败(needadonors,CONSTRAINT donors_donor_id_foreign FOREIGN KEY({{ 1}})REFERENCES donor_idusers)ON DELETE CASCADE ON UPDATE CASCADE)(SQL:插入iddonorsdate_of_birth,{{1 }},blood_grouplocationphone_numberlast_date_of_donation)值(2014-08-13,A-,SHARIATPUR,01796580404,2014-08-13,2014- 08-17 05:30:38,2014-08-17 05:30:38))

经过大量的研究和谷歌搜索并在其他论坛中进行查询后,有人告诉我,这种情况正在发生,因为我没有指定相关用户或用户尚未创建,但我已经登录为用户(罗伯特摩尔)。所以我不相信这个答案。所以我需要你们的帮助。我可能在这里犯了很大的错误,但我无法理解,因为我在Laravel非常新。

为了更方便,我也在这里提供了用户捐赠者模型。

用户模型:

updated_at

捐助者模型:

created_at

1 个答案:

答案 0 :(得分:1)

保存捐赠者数据时使用以下代码:

$user = Auth::user(); // get logged in user

// create donor
$donor = Donor::create([
    'date_of_birth' => $date_of_birth,
    'blood_group' => $blood_group,
    'location' => $location,
    'phone_number' => $phone_number,
    'last_date_of_donation'=> $last_date_of_donation
]);

// save new donor and associate it with the user
$user->Donor()->save($donor);