模型中多态的多对多关系,如果关联表中的外键 id 类型是 varchar 类型,但是存入的是 int 型数据,那么删除关联数据时会报错

环境

laravel版本:5.5
mysql版本:5.7
php版本:7.2

表关系

在使用<多态多对多>做标签时,有四张表
主表1:table1 (主键为uuid,例:4746c007-0be8-4cce-a4d0-d0e33fd469b7)
主表2:table2 (主键为自增int)
标签表:tags
关联表 taggables (字段为:tag_id<char 36>  ,taggable_id<char 36>, taggable_type<varchar 191>)

关联表中分别插入table1的主键信息和table2的主键信息。

问题描述

由于table1和table2的主键类型不一样,所以我给关联表中的taggable_id设置为char类型,插入和查询没有问题,但是删除的时候,
执行$table2Model->tags()->detach([tag_id1,tag_id2]),会出现如下错误:
Error : Truncated incorrect DOUBLE value

执行
$table1Model->tags()->detach([tag_id1,tag_id2]),则正常删除。

初步排查

  • 在打印删除sql语句的时候,发现如下
    delete from `taggables` where `taggable_id` = 14 and `taggable_type` = "table2"  and  tag_id` in ("1bcecc13-e873-499c-913c-d9246a898180")
  • 已知
    已知mysql在字段类型是字符型,但值却用了数字类型,在update,或者delete的时候会出现sql报错:Error : Truncated incorrect DOUBLE value
    如上sql语句改成 delete from `taggables` where `taggable_id` = '14' and `taggable_type` = "table2"  and  tag_id` in ("1bcecc13-e873-499c-913c-d9246a898180") 就不会报错。

但是,此删除语句是执行$table2Model->tags()->detach([tagid1,tagid2])生成的,在不建立关联表模型的情况下,我应该如何改,才能生成正确的sql语句呢?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!