php - 在 laravel 中使用外键保存对象

标签 php mysql laravel foreign-keys

我使用 PHP、Laravel 5.2 和 MySQL。

在用户注册期间,我需要创建一个新患者。但是,患者有用户 ID、联系人 ID 和监护人 ID(外键)。

当我尝试 save() 患者时,出现以下异常:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'patient_id' in 'field list' (SQL: update users set patient_id = 0, updated_at = 2016-06-07 12:59:35 where id = 6)

问题是我没有patient_id 列。相反,我有 patientId

我不知道如何解决这个问题。任何帮助将不胜感激。如果这很重要,我可以包含迁移文件。

UserController.php

public function postSignUp(Request $request)
{
    $this->validate($request,[
        'email' => 'required|email|unique:users',
        'name' => 'required|max:100',
        'password' => 'required|min:6'
    ]);


    $guardian = new Guardian();
    $guardian->guardianId = Uuid::generate();;
    $guardian->save();

    $contact = new Contact();
    $contact->contactId = Uuid::generate();
    $contact->save();

    $user = new User();
    $user->email = $request['email'];
    $user->name = $request['name'];
    $user->password = bcrypt($request['password']);
    $user->save();


    $patient = new Patient();
    $patient->patientId = (string)Uuid::generate();
    $patient->user()->save($user);
    $patient->contact()->save($contact);
    $patient->guardian()->save(guardian);



    $patient->save();
    Auth::login($user);

//        return redirect()->route('dashboard');
}

患者.php

class Patient extends Model
{
    protected $primaryKey='patientId';
    public $incrementing = 'false';
    public $timestamps = true;

    public function user()
    {
        return $this->hasOne('App\User');
    }
    public function contact()
    {
        return $this->hasOne('App\Contact');
    }
    public function guardian()
    {
        return $this->hasOne('App\Guardian');
    }
    public function allergies()
    {
        return $this->belongsToMany('App\PatientToAllergyAlert');
    }
    public function medicalAlerts()
    {
        return $this->belongsToMany('App\PatientToMedicalAlert');
    }
}

User.php

class User extends Authenticatable
{
    protected $fillable = [
        'name', 'email', 'password',
    ];
    protected $hidden = [
        'password', 'remember_token',
    ];
    public function patient()
    {
        return $this->belongsTo('App\Patient');
    }
}

Contact.php

class Contact extends Model
{
    protected $table = 'contacts';
    protected $primaryKey = 'contactId';
    public $timestamps = true;
    public $incrementing = 'false';

    public function contact()
    {
        return $this->belongsTo('App\Patient');
    }
}

Guardian.php

class Guardian extends Model
{
    protected $table = 'guardians';
    protected $primaryKey = 'guardianId';
    public $timestamps = true;
    public $incrementing = 'false';

    public function contact()
    {
        return $this->belongsTo('App\Patient');
    }
}

最佳答案

您没有正确定义关系。首先,将表格字段填写到 Patient、Contact、Guardian 类中的 $fillable 数组中(就像在 User 类中一样)。

如果你想在 Patient 和 User 之间使用 hasOne 关系,你需要 patients 表上的 user_id 字段。您也可以使用 belongsTo 关系。

如果您想使用自定义列名,只需在关系方法中指定它们即可:

public function user()
{
    return $this->hasOne('App\User', 'id', 'user_id');
    // alternatively
    return $this->belongsTo('App\User', 'user_id', 'id');
}

只需浏览文档而不跳过段落,您将在几分钟内开始:) https://laravel.com/docs/5.1/eloquent-relationships#defining-relationships

此外,这将不起作用:

$patient = new Patient();
$patient->patientId = (string)Uuid::generate();
$patient->user()->save($user);

new Patient() 仅创建对象,但不将其存储在数据库中,因此您将无法保存关系。您需要创建对象并将其存储到数据库以避免此问题:

$patient = Patient::create(['patientId' => (string)Uuid::generate()]);
$patient->user()->save($user);
...

// or
$patient = new Patient();
$patient->patientId = (string)Uuid::generate();
$patient->save();
$patient->user()->save($user);
...

关于php - 在 laravel 中使用外键保存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37680614/

相关文章:

laravel - 使用el-upload和axios上传文件,没有进度条

mysql 限制和偏移连接的性能

mysql - 如何查看mysql数据库的密码和用户名?

php - 检查日期是否在 Laravel 5 的日期范围内

php - JavaScript 中的输入元素

php - Ubuntu 14.04上的Apache 2.4.7不会通过PHP 5.5连接到MSSQL

php - 在 Laradock 应用程序中找不到类 'MongoId'

php - 关键字 GO 在 PHP 中抛出错误

php - 此查询在不起作用时删除记录

php - Laravel Eloquent 使用相同的外键获取多个记录