Mysql Symfony:加载具有多列主键(也是外键)的对象的固定装置
我正在用symfony为我的项目编写fixture,当我尝试将fixture添加到具有多列主键的对象时,会遇到问题,这也是其他表的外键 以下是MySql工作台中的模式: 我使用workbench生成了sql代码,然后使用symfony任务Mysql Symfony:加载具有多列主键(也是外键)的对象的固定装置,mysql,symfony1,schema,foreign-keys,fixtures,Mysql,Symfony1,Schema,Foreign Keys,Fixtures,我正在用symfony为我的项目编写fixture,当我尝试将fixture添加到具有多列主键的对象时,会遇到问题,这也是其他表的外键 以下是MySql工作台中的模式: 我使用workbench生成了sql代码,然后使用symfony任务php symfony原则:构建模式生成了schema.yml文件 这是为这些表生成的sql: -- ----------------------------------------------------- -- Table `mydb`.`MetodoEn
php symfony原则:构建模式生成了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
这是为这些表生成的架构:
-- -----------------------------------------------------
-- 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)
由于错误与外键有关,我认为可能与模式中的引用有关,比如zonanvio:dhl_zona1
。如何引用“父对象”?我认为这不是一种继承,而是一种脆弱的关系
请原谅我的问题太长,但我想为您提供所有必要的信息,以便您能帮助我
非常感谢你的帮助 这是一个mysql约束错误,意味着要插入的值在相关表中不存在
您的夹具格式与我对1.x版symfony/doctrine组合的理解不符。请查看此帮助以了解正确的格式:。例如,创建id为1的行:
MetodoEnvio:
MetodoEnvio_1:
nombre: Retiro Personal
precio: 0.0
然后,当您需要引用与id=1的Metodenvio相关的表时,您可以使用Metodenvio_1,尽管您可能只需要使用id:1,因为您知道id将为1。我发现了问题所在。这与如何在schema.yml
文件中定义关系有关。请注意,它表示定义同一类的两个关系的两个字段主键:
.
.
.
relations:
ZonaEnvio:
local: idmetodo
foreign: id
type: one
ZonaEnvio_2:
class: ZonaEnvio
local: zona
foreign: numero
type: one
关系在PrecioEnvio
和intervalometoEnvio
中定义为这样,这两个都是zoneEnvio
的弱实体。因此,我只需要为fixture中的两个关系提供值,并将它们指向先前定义的zonanvio
对象的同一个实例。像这样:
IntervaloMetodoEnvio:
dhl_zona_1:
ZonaEnvio: dhl_zona1
ZonaEnvio_2: dhl_zona1
intervalo: 0.5
precio: 3.05
dhl_zona_5:
ZonaEnvio: dhl_zona5
ZonaEnvio_2: dhl_zona5
intervalo: 0.5
precio: 7.15
PrecioEnvio:
fila1_zona1:
ZonaEnvio: dhl_zona1
ZonaEnvio_2: dhl_zona1
inicioRango: 0.00
finRango: 0.50
precio: 26.90
fila1_zona5:
ZonaEnvio: dhl_zona5
ZonaEnvio_2: dhl_zona5
inicioRango: 00
finRango: 0.50
precio: 59.60
通知
ZonaEnvio: dhl_zona1
ZonaEnvio_2: dhl_zona1
两条线位于同一设备定义中,并指向同一实例。这样,设备就可以成功加载
无论如何谢谢你的努力gview 谢谢,但是你所说的“我不知道”不需要这样称呼。这只是一个名称,所以我可以在以后的装置中引用它。事实上,metodonevio
和zonanvio
是我的fixture在执行任务时唯一正确加载的表。问题是在添加IntervalomeToEnvio
或PrecioEnvio
时,其主键也是ZoneEnvio
的外键,并且有两个字段。这就是我在这里要问的。。。无论如何,谢谢你花时间阅读!如果您有其他想法,请不要犹豫发布!我还没有解决这个问题…当您使用表_1时,键将是1,因此它是可预测的。父表的键似乎没有按照您假定的方式插入到依赖表中。再次感谢您,但是没有,夹具中实例名称后的数字\u 1
并不强制它是第一个。至少在教义上不是这样。条令安排固定装置以正确的顺序装载。即使这是正确的,这也不是我要问的。我的问题是前面的评论中提到的表,这些表引用了metodonevio
。此外,我们在fixture中不显式使用键。我们使用对对象的引用。这个推理让我找到了答案,它与模式中生成的关系有关。我会在强制8小时过后发布我的答案,因为我的声誉不到100。尽管如此,如果有人在规定的时间内给出了正确的答案,我还是会接受这个答案。无论如何,谢谢。@Throze:我确实理解这个问题,尽管我想我解释得不是很好。我的观点是,您假设因为一个表有一个多列键,所以将它命名为fixture将允许您稍后引用它,并让它带着所有键以外键关系填充子行。这在您的模型中似乎不起作用,所以我只是尝试提出一些其他方法来强制fixture装入器绕过这个问题。很高兴听到您找到了解决此问题的方法,并将使用您的解决方案进行更新。