【问题标题】:Foreign Key Constraint Fail in laravellaravel中的外键约束失败
【发布时间】:2019-05-23 01:12:11
【问题描述】:

我正在尝试创建具有 guest_id 和 department_to_visit 外键的日志条目

SQL:

DROP TABLE IF EXISTS `logs`;
CREATE TABLE `logs`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `guest_id` int(11) NOT NULL,
  `guest_id_number` int(11) NOT NULL,
  `date_time_in` datetime(0) NOT NULL,
  `date_time_out` datetime(0) NULL DEFAULT NULL,
  `purpose` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `department_to_visit` int(11) NULL DEFAULT NULL,
  `updated_at` timestamp(6) NULL DEFAULT NULL,
  `created_at` timestamp(6) NULL DEFAULT NULL,
  PRIMARY KEY (`id`, `guest_id`) USING BTREE,
  INDEX `fk_logs_guests1_idx`(`guest_id`) USING BTREE,
  INDEX `fk_logs_dept1_idx`(`department_to_visit`) USING BTREE,
  CONSTRAINT `fk_logs_dept1` FOREIGN KEY (`department_to_visit`) REFERENCES `dept` (`dept_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_logs_guests1` FOREIGN KEY (`guest_id`) REFERENCES `guests` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)

日志模型

class Logs extends Model
{
    protected $table = 'logs';
    public function guests()
    {
        return $this->belongsTo('App\Guest','guest_id','id');
    }
    public function departments()
    {
        return $this->belongsTo('App\Department','department_to_visit','dept_id');
    }

我不断收到错误 SQLSTATE[23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败 (guest_log.logs, CONSTRAINT fk_logs_dept1 FOREIGN KEY (department_to_visit ) 参考dept (dept_id) ON DELETE NO ACTION ON UPDATE NO ACTION) (SQL: insert into logs (guest_id, guest_id_number, purpose, department_to_visit, date_time_in, @987 @, created_at) 值 (4, 2, 2, 1, 2018-12-23 12:53:22, 2018-12-23 12:53:22, 2018-12-23 12:53:22))

每当我尝试使用

创建新的日志记录时

日志控制器

  public function store(Request $request)
    {
        $this->validate($request, [
            'guest_id'=>'required',
            'guest_id_number'=>'required',
            'purpose'=>'required',
            'department_to_visit']);
        $logs = new Logs();
        $guest = Guest::findOrFail($request->guest_id);
        $logs->guest_id = $guest->id;
        $logs->guest_id_number = $request->guest_id_number;
        $logs->purpose = $request->purpose;
        echo $request->department_to_visit;
        $department= Department::findOrFail($request->department_to_visit);
//        echo '<pre>',var_dump($department),'</pre>';
        $logs->department_to_visit =$department->dept_id;
        $logs->date_time_in = Carbon::now();
        $logs->save();
//        return redirect(route('home'));
    }

使用这种方法

 <div class="container-fluid">
        {!! BootForm::inline(['route'=>['logs.store'],'method'=>'POST']) !!}

        {!! BootForm::select('guest_id', 'Guest Name',\App\Guest::pluck('last_name','id'),null, [])!!}


        {!! BootForm::tel('guest_id_number','ID Number',null, ['required']) !!}
        {!! BootForm::select('department_to_visit','Department to Visit', App\Department::pluck('dept_code','dept_id'),null,[]) !!}
        {!! BootForm::text('purpose',null,null,['required']) !!}

        {!! BootForm::submit('Save') !!}

        {!! BootForm::close() !!}


    </div>

我曾经收到有关 guest_id 的错误,但已解决。我认为 guest_id 不会有什么不同,但 department_to_visit 继续收到错误。请帮助我解决和了解问题的原因

【问题讨论】:

  • 尝试将App\Department::pluck('dept_code','dept_id')改为App\Department::pluck('dept_id', 'dept_code')
  • @ЕвгенийОдинец 错误仍然存​​在

标签: php sql laravel laravel-5


【解决方案1】:

确实令人费解,因为代码看起来像是在尝试在插入中使用它们之前立即检索了相关的主键,所以你希望这些事情能够解决。

以下查询之一不得产生任何行:

SELECT * FROM guests WHERE id = 4

SELECT * FROM dept WHERE dept_id = 1 --is the PK id, or dept_id?

通过提供表中存在的 ID 来解决此问题。仔细检查您的外键是否引用了正确的远程主键(我注意到客人表 PK 称为 ID,但部门表 PK 似乎称为 dept_id?是否正确?)并且 findOrFail 方法搜索的列绝对是主键柱子。有没有什么方法可以让 findOrFail 找到错误的东西,而不是失败?

最后,当您在查询工具中运行这些时,请绝对确保您在调试时查询的数据库与您的服务器所连接的数据库完全相同。

【讨论】:

    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 2016-01-20
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2011-11-03
    • 1970-01-01
    相关资源
    最近更新 更多