【问题标题】:Persistent Integrity Constraint Laravel持久完整性约束 Laravel
【发布时间】:2018-12-23 09:21:00
【问题描述】:

我对理解关系和 MVC 还是很陌生。但我尝试按照我在网上阅读的所有内容进行操作,但仍然收到此错误。

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`guest_log`.`logs`, CONSTRAINT `fk_logs_guests1` FOREIGN KEY (`guest_id`) REFERENCES `guests` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) 

这是客户、日志和部门的 SQL

DROP TABLE IF EXISTS `Dept`;
CREATE TABLE `Dept` (
  `dept_id` int(5) NOT NULL AUTO_INCREMENT,
  `dept_code` varchar(30) CHARACTER SET latin1 DEFAULT NULL,
  `dept_description` varchar(75) CHARACTER SET latin1 NOT NULL,
  `dept_assign` enum('Academic','Admin') CHARACTER SET latin1 NOT NULL DEFAULT 'Academic',
  `is_deleted` enum('Yes','No') CHARACTER SET latin1 DEFAULT 'No',
  PRIMARY KEY (`dept_id`)
)
-- ----------------------------
-- Table structure for guests
-- ----------------------------
DROP TABLE IF EXISTS `guests`;
CREATE TABLE `guests` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `middle_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `last_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `gender` varchar(6) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `email` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `tel_no` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `mobile_no` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `company` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `photo` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ----------------------------
-- Table structure for logs
-- ----------------------------
DROP TABLE IF EXISTS `logs`;
CREATE TABLE `logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `guest_id` int(11) NOT NULL,
  `guest_id_number` datetime NOT NULL,
  `date_time_in` datetime NOT NULL,
  `date_time_out` datetime DEFAULT NULL,
  `purpose` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL,
  `department_to_visit` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`,`guest_id`),
  KEY `fk_logs_guests1_idx` (`guest_id`),
  KEY `fk_logs_Dept1_idx` (`department_to_visit`),
  CONSTRAINT `fk_logs_guests1` FOREIGN KEY (`guest_id`) REFERENCES `guests` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_logs_Dept1` FOREIGN KEY (`department_to_visit`) REFERENCES `Dept` (`dept_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

这里是模型。

class Guest extends Model
{
    protected $table = 'guests';
    public function logs()
    {
        return $this->hasMany('App\Log');
    }
}

class Log 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');
    }

}
class Department extends Model
{
    protected $table = 'dept';
    public function logs()
    {
        return $this->hasMany('App\Log','department_to_visit','dept_id');
    }

}

每当我尝试为日志创建新条目时,都会收到此完整性约束违规错误。请帮助我解决并了解我遇到此问题的原因。

更新:

创建日志条目的代码

 <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_description','dept_id'),null,[]) !!}
        {!! BootForm::text('purpose',null,null,['required']) !!}

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

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


    </div>

log.store 方法

public function store(Request $request)
{
    $this->validate($request, [
        'guest_id'=>'required',
        'guest_id_number'=>'required',
        'purpose'=>'required',
        'department_to_visit']);
    $logs = new Log();
    $logs->guest_id = $request->guest_id;
    $logs->guest_id_number = $request->guest_id_number;
    $logs->purpose = $request->purpose;
    $logs->department_to_visit = $request->department_to_visit;
    $logs->date_time_in = Carbon::now();
    $logs->save();
    return redirect(route('home'));
}

【问题讨论】:

  • 你能把代码贴在你试图在哪里创建日志条目吗?
  • @Peter 我刚刚更新了创建代码
  • 您的代码看起来是正确的,错误表明您没有提供有效的客人 ID。我会查看您的请求中传递的内容,看看它是否真的与任何现有记录匹配。

标签: php laravel laravel-5


【解决方案1】:

可能是您没有传递现有的访客 ID。 为了正常检查它,我搜索模型,例如。

$guest = Guest::findOrFail($request->guest_id); 

并使用

$logs->guest_id = $guest->id;

试试这个,让我知道它是如何工作的 :)

【讨论】:

  • 它适用于客人。但与部门无关。我为部门尝试了这条线` $department=Department::findOrFail($request->department_to_visit); $logs->department_to_visit = $department->dept_id;` error is Column not found: 1054 Unknown column 'dept.id' in 'where clause' (SQL: select * from dept where dept.id = 1 个限制 1)
  • 这是因为您的部门没有像主键一样的'id'列。有两种方法可以解决这个问题。 1)$department = Department::where('yourprimarykey',$request-&gt;department_to_visit')-&gt;first();或在您的departmet模型中声明主键protected $primaryKey='thefieldprimarykeyinyourtable';
  • 两种方式都收到相同的完整性约束错误
猜你喜欢
  • 2020-04-22
  • 2019-04-12
  • 1970-01-01
  • 2015-05-07
  • 2016-11-22
  • 2016-08-11
  • 1970-01-01
  • 2019-01-02
相关资源
最近更新 更多