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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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