如何建立对外关系


How to set foreign relationship?

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

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

1.Blood Donation
2.Matrimonial 

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

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

->则用户将登录。示例用户以Robert Moore登录。

->以Robert Moore的身份登录后,用户将获得两个链接(1。献血表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(作为示例)登录,但是如果他想成为一名献血者,他将只需要提供与献血相关的信息(接受他的姓名,电子邮件),因为这些信息在他注册时已经存储在user表中。这就是为什么我在献血表(如上所述)中提供了这些字段,这与献血有关,除了名称,电子邮件。现在这些提交的数据将存储在donor表中。

现在,这里我所做的是,通过外键在User表和donor表之间建立一个一对一的关系,因为签入的用户是实际献血者的同一用户。现在我将向您展示关于Donor模型的迁移文件,其中我与User模型建立了外键关系。下面是迁移文件(部分),
 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]: Integrity constraint violation: 1452不能添加或更新子行:a foreign key constraint fails (needa . c .)donors, CONSTRAINT donors_donor_id_foreign FOREIGN KEY (donor_id) REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE (SQL: insert into donors (date_of_birth, blood_group, location, phone_number, last_date_of_donation, updated_at, created_at) values (2014-08-13, A-, sharariatpur, 01796580404, 2014-08-13, 2014-08-17 05:30:38, 2014-08-17 05:30:38))

经过大量的研究和谷歌搜索,并在其他论坛查询,有人告诉我,这是发生的,因为,我没有指定相关的用户或用户尚未创建,但我已经登录为用户(罗伯特·摩尔)。所以我不相信这个答案。所以我需要你们的帮助。可能我在这里犯了很大的错误,但我不能弄清楚,因为我是Laravel的新手。

为了更好的方便,我在这里也给出了我的用户供体模型。

用户模式:

<?php
use Illuminate'Auth'UserTrait;
use Illuminate'Auth'UserInterface;
use Illuminate'Auth'Reminders'RemindableTrait;
use Illuminate'Auth'Reminders'RemindableInterface;
class User extends Eloquent implements UserInterface, RemindableInterface {
    public function Donor(){
        return $this->hasOne('Donor','donor_id');
    }
    public function getRememberToken()
    {
        return $this->remember_token;
    }
    public function setRememberToken($value)
    {
        $this->remember_token = $value;
    }
    public function getRememberTokenName()
    {
        return 'remember_token';
    }
protected $fillable = array('email','username','password','password_temp','code','active');
use UserTrait, RemindableTrait;
/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'users';

/**
 * The attributes excluded from the model's JSON form.
 *
 * @var array
 */
protected $hidden = array('password', 'remember_token');
}

捐赠者模型:

<?php
use Illuminate'Auth'UserTrait;
use Illuminate'Auth'UserInterface;
use Illuminate'Auth'Reminders'RemindableTrait;
use Illuminate'Auth'Reminders'RemindableInterface;
 class Donor extends Eloquent implements UserInterface, RemindableInterface {
    public function user(){
        return $this->belongsTo('User');
    }
    public function getRememberToken()
    {
        return $this->remember_token;
    }
    public function setRememberToken($value)
    {
        $this->remember_token = $value;
    }
    public function getRememberTokenName()
    {
        return 'remember_token';
    }
    protected $fillable=array
    (   //'donor_name',
        //'email',
        'blood_group',
        'phone_number',
        'location',
        'date_of_birth',
        'last_date_of_donation'
    );
    use UserTrait, RemindableTrait;

}

保存供体数据时使用以下代码:

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