模型中多态的多对多关系,如果关联表中的外键 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语句呢?
推荐文章: