gpt4 book ai didi

mysql - 交响乐 : Loading fixtures of objects with multiple column primary key which are also foreign keys

转载 作者:行者123 更新时间:2023-11-29 02:34:33 25 4
gpt4 key购买 nike

我在 symfony 中为我的项目编写固定装置,当我尝试向具有多列主键的对象添加固定装置时,我遇到了一些问题,这也是其他表的外键。

这是 MySql Workbench 中的架构:

MySQL WorkBench representation of the schema

我用 workbench 生成了 sql 代码,然后用 symfony 任务 php symfony doctrine:build-schema 生成了 schema.yml 文件。

这是为这些表生成的 sql:

-- -----------------------------------------------------
-- Table `mydb`.`MetodoEnvio`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`MetodoEnvio` ;

CREATE TABLE IF NOT EXISTS `mydb`.`MetodoEnvio` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`nombre` VARCHAR(45) NOT NULL ,
`precio` DECIMAL(10,2) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;

-- -----------------------------------------------------
-- Table `mydb`.`ZonaEnvio`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`ZonaEnvio` ;

CREATE TABLE IF NOT EXISTS `mydb`.`ZonaEnvio` (
`id` INT UNSIGNED NOT NULL ,
`numero` INT(3) UNSIGNED NOT NULL ,
`etiqueta` VARCHAR(255) NOT NULL ,
PRIMARY KEY (`id`, `numero`) ,
INDEX `fk_ZonaEnvio_MetodoEnvio` (`id` ASC) ,
INDEX `numeroZona_INDEX` (`numero` ASC) ,
CONSTRAINT `fk_ZonaEnvio_MetodoEnvio`
FOREIGN KEY (`id` )
REFERENCES `mydb`.`MetodoEnvio` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;

-- -----------------------------------------------------
-- Table `mydb`.`PrecioEnvio`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`PrecioEnvio` ;

CREATE TABLE IF NOT EXISTS `mydb`.`PrecioEnvio` (
`idMetodo` INT UNSIGNED NOT NULL ,
`zona` INT(3) UNSIGNED NOT NULL ,
`inicioRango` DECIMAL(10,2) NOT NULL COMMENT 'Marca el inicio del rango de peso para el cual este precio aplica.' ,
`finRango` DECIMAL(10,2) NULL COMMENT 'Marca el fin del rango de peso para el cual este precio aplica.' ,
`precio` DECIMAL(10,2) NOT NULL ,
PRIMARY KEY (`idMetodo`, `inicioRango`, `finRango`, `zona`) ,
INDEX `fk_PrecioEnvio_ZonaEnvio` (`idMetodo` ASC, `zona` ASC) ,
CONSTRAINT `fk_PrecioEnvio_ZonaEnvio`
FOREIGN KEY (`idMetodo` , `zona` )
REFERENCES `mydb`.`ZonaEnvio` (`id` , `numero` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;

-- -----------------------------------------------------
-- Table `mydb`.`IntervaloMetodoEnvio`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`IntervaloMetodoEnvio` ;

CREATE TABLE IF NOT EXISTS `mydb`.`IntervaloMetodoEnvio` (
`idMetodo` INT UNSIGNED NOT NULL ,
`zona` INT(3) UNSIGNED NOT NULL ,
`intervalo` DECIMAL(10,2) NOT NULL ,
`precio` DECIMAL(10,2) NOT NULL ,
PRIMARY KEY (`idMetodo`, `zona`) ,
INDEX `fk_IntervaloMetodoEnvio_ZonaEnvio` (`idMetodo` ASC, `zona` ASC) ,
CONSTRAINT `fk_IntervaloMetodoEnvio_ZonaEnvio`
FOREIGN KEY (`idMetodo` , `zona` )
REFERENCES `mydb`.`ZonaEnvio` (`id` , `numero` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;

这是为这些表生成的架构:

MetodoEnvio:
connection: doctrine
tableName: MetodoEnvio
columns:
id:
type: integer(4)
fixed: false
unsigned: true
primary: true
autoincrement: true
nombre:
type: string(45)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
precio:
type: 'decimal(10, 2)'
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
relations:
TiendaOrden:
local: id
foreign: metodoenvio
type: many
ZonaEnvio:
local: id
foreign: id
type: many
ZonaEnvio:
connection: doctrine
tableName: ZonaEnvio
columns:
id:
type: integer(4)
fixed: false
unsigned: true
primary: true
autoincrement: false
numero:
type: integer(4)
fixed: false
unsigned: true
primary: true
autoincrement: false
etiqueta:
type: string(255)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
relations:
MetodoEnvio:
local: id
foreign: id
type: one
IntervaloMetodoEnvio:
local: id
foreign: idmetodo
type: many
IntervaloMetodoEnvio_2:
class: IntervaloMetodoEnvio
local: numero
foreign: zona
type: many
PrecioEnvio:
local: id
foreign: idmetodo
type: many
PrecioEnvio_2:
class: PrecioEnvio
local: numero
foreign: zona
type: many
PrecioEnvio:
connection: doctrine
tableName: PrecioEnvio
columns:
idmetodo:
type: integer(4)
fixed: false
unsigned: true
primary: true
autoincrement: false
zona:
type: integer(4)
fixed: false
unsigned: true
primary: true
autoincrement: false
iniciorango:
type: 'decimal(10, 2)'
fixed: false
unsigned: false
primary: true
autoincrement: false
finrango:
type: 'decimal(10, 2)'
fixed: false
unsigned: false
primary: true
autoincrement: false
precio:
type: 'decimal(10, 2)'
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
relations:
ZonaEnvio:
local: idmetodo
foreign: id
type: one
ZonaEnvio_2:
class: ZonaEnvio
local: zona
foreign: numero
type: one
IntervaloMetodoEnvio:
connection: doctrine
tableName: IntervaloMetodoEnvio
columns:
idmetodo:
type: integer(4)
fixed: false
unsigned: true
primary: true
autoincrement: false
zona:
type: integer(4)
fixed: false
unsigned: true
primary: true
autoincrement: false
intervalo:
type: 'decimal(10, 2)'
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
precio:
type: 'decimal(10, 2)'
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
relations:
ZonaEnvio:
local: idmetodo
foreign: id
type: one
ZonaEnvio_2:
class: ZonaEnvio
local: zona
foreign: numero
type: one

然后,我编写了以下固定装置:

MetodoEnvio:
personal:
nombre: Retiro Personal
precio: 0.0

mrw:
nombre: MRW
precio: 5.0

dhl:
nombre: DHL
precio: -1.0
ZonaEnvio:
dhl_zona1:
MetodoEnvio: dhl
numero: 1
etiqueta: DHL (Envios en la Zona Metropolitana)

dhl_zona5:
MetodoEnvio: dhl
numero: 5
etiqueta: DHL (Envios al interior del pais)
PrecioEnvio:
fila1_zona1:
ZonaEnvio: dhl_zona1
inicioRango: 0.00
finRango: 0.50
precio: 26.90

fila1_zona5:
ZonaEnvio: dhl_zona5
inicioRango: 00
finRango: 0.50
precio: 59.60
IntervaloMetodoEnvio:
dhl_zona_1:
ZonaEnvio: dhl_zona1
intervalo: 0.5
precio: 3.05

dhl_zona_5:
ZonaEnvio: dhl_zona5
intervalo: 0.5
precio: 7.15

当我执行命令 php symfony doctrine:data-load 时,它返回错误:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`mydb`.`PrecioEnvio`, CONSTRAINT `fk_PrecioEnvio_ZonaEnvio` FOREIGN KEY (`idMetodo`, `zona`) REFERENCES `ZonaEnvio` (`id`, `numero`) ON DELETE NO ACTION ON UPDATE NO ACTION)

由于错误与外键有关,我认为它可能与我在架构中的引用有关,如 ZonaEnvio: dhl_zona1。我如何引用“父对象”?我觉得这不像是继承,更像是一种弱关系……

请原谅我的问题太长,但我想为您提供所有必要的信息,以便您能帮助我!

非常感谢您的帮助!

最佳答案

这是一个 mysql 约束错误,这意味着正在插入的值在相关表中不存在。

你的 fixture 格式不符合我对版本 1.x symfony/doctrine 组合的理解。查看此帮助以了解正确的格式:http://www.symfony-project.org/doctrine/1_2/en/05-Data-Fixtures .例如,创建一个 id 为 1 的行:

MetodoEnvio:
MetodoEnvio_1:
nombre: Retiro Personal
precio: 0.0

然后当您需要引用与 id = 1 的 MetodoEnvio 相关的表时,您可以使用 MetodoEnvio_1,尽管您可能可以简单地使用 id: 1,因为知道 id 将为 1。

关于mysql - 交响乐 : Loading fixtures of objects with multiple column primary key which are also foreign keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7296350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com