我有以下型号:
WebPromocion:
connection: doctrine
tableName: WebPromocion
columns:
id:
type: integer(4)
fixed: false
unsigned: true
primary: true
autoincrement: true
nombre:
type: string(100)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
foto:
type: integer(4)
fixed: false
unsigned: true
primary: false
notnull: true
autoincrement: false
flyer:
type: integer(4)
fixed: false
unsigned: true
primary: false
notnull: true
autoincrement: false
desde:
type: timestamp(25)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
hasta:
type: timestamp(25)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
descripcion:
type: string()
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
status:
type: string(1)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
relations:
WebFoto:
local: foto
foreign: id
type: one
WebFoto_2:
class: WebFoto
local: flyer
foreign: id
type: one
WebPromocion_Producto:
local: id
foreign: promocion
type: many
WebFoto:
connection: doctrine
tableName: WebFoto
columns:
id:
type: integer(4)
fixed: false
unsigned: true
primary: true
autoincrement: true
ruta:
type: string(500)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
archivo:
type: string(150)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
nombre:
type: string(255)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
alt:
type: string(255)
fixed: false
unsigned: false
primary: false
default: ''
notnull: true
autoincrement: false
width:
type: integer(4)
fixed: false
unsigned: true
primary: false
notnull: true
autoincrement: false
height:
type: integer(4)
fixed: false
unsigned: true
primary: false
notnull: true
autoincrement: false
map:
type: integer(4)
fixed: false
unsigned: true
primary: false
notnull: false
autoincrement: false
title:
type: string(500)
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
thumbnail:
type: string(500)
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
relations:
WebFotoMap:
local: map
foreign: id
type: one
WebNoticia:
local: id
foreign: foto
type: many
WebPromocion:
local: id
foreign: foto
type: many
WebPromocion_2:
class: WebPromocion
local: id
foreign: flyer
type: many
如您所见,我的WebPromocion
对象有两个引用WebFoto
个对象的字段('foto'字段和'flyer'字段)。我正在为WebPromocion
编写一个表单,为WebFoto
嵌入两个表单,一个名为'foto',另一个名为'flyer'....我用netbeans调试它,它似乎构建得很好对象,它保存嵌入的对象,但是当它要保存WebPromocion
时,sql查询如下:
INSERT INTO WebPromocion (foto, nombre, desde, hasta, descripcion, status,
flyer) VALUES (?, ?, ?, ?, ?, ?, ?) - (5, prueba, 2011-12-29, 2011-12-29,
wepale, A, Array)
在调试时,我发现传递给负责执行的函数的参数是错误的:
exec('INSERT INTO WebPromocion (foto, nombre, desde, hasta, descripcion, status,
flyer) VALUES (?, ?, ?, ?, ?, ?, ?)', array('5', 'prueba', '2011-12-29',
'2011-12-29', 'wepale', 'A', array('nombre' => 'radioactivo', 'alt' =>
'radioactivo', 'width' => 100, 'height' => 100, 'title' => 'help!!!', 'maps' =>
array('map' => array('name' => 'map2', 'areas' => array('area_1' => array(
'shape' => 'rect', 'coords' => '0,0,100,100', 'href' => 'google.com', 'alt'
=> 'google', 'title' => 'google', 'id' => null)), 'id' => null)), 'id' =>
null, 'archivo' => object('sfValidatedFile'))))
因此,对于第一个外键字段('foto'),它会放置正确的值(在这种情况下为'5',对应于相关WebFoto
的id或主键),但是第二个('flyer'),它放置代表WebFoto
对象的数组,而不是它的主键......
我不知道该怎么做才能解决这个问题...我尝试使用空表格嵌入WebFotoForm
个,然后将这个嵌入WebPromocionForm
中,但这样一来甚至没有保存WebFoto
个对象...我认为这个问题甚至可能是一个调节问题,而不是有两个外键('foto'和'flyer'),我必须有一个多对多的关系...但这只是一个假设,我试图避免模型中的变化......
答案 0 :(得分:1)
我认为你的模型有点乱(实际上,我认为它是一些自动生成的schema.yml)。也许缺少一些信息(作为Producto实体)。 这里有一些技巧可以帮助您手动和有序地定义模型(假设Doctrine 1.2):
你的模型会变成:
WebPromocion:
columns:
nombre: { type: string(100), notnull: true }
foto_id: { type: integer, notnull: true }
flyer_id: { type: integer, notnull: false }
desde: { type: timestamp, notnull: true }
hasta: { type: timestamp, notnull: true }
description: { type: clob, notnull: false }
status: { type: string(1), notnull: true, default: 'X' } # some default value looks great for a status column
relations:
WebFoto: { onDelete: CASCADE, local: foto_id, foreign: id, foreignAlias: WebPromociones }
Flyer: { class: WebFoto, onDelete: SET NULL, local: flyer_id, foreign: id, foreignAlias: WebPromociones }
Productos: { class: Producto, refClass: WebPromocionProducto, local: webpromocion_id, foreign: producto_id }
webFoto:
columns:
ruta: { type: string(500), notnull: true }
archivo: { type: string(150), notnull: true }
nombre: { type: string(255), notnull: true, default: '' }
width: { type: integer(4), notnull: true }
height: { type: integer(4), notnull: true }
map: { type: integer(4), notnull: false }
title: { type: string(500), notnull: false }
thumbnail: { type: string(500), notnull: false }
Producto:
relations:
WebPromociones: { class: WebPromocion, refClass: WebPromocionProducto, local: producto_id, foreign: webpromocion_id }
WebPromocionProducto:
columns:
producto_id: { type: integer, notnull: true }
webpromocion_id: { type: integer, notnull: true }
relations:
Producto: { onDelete: CASCADE, local: producto_id, foreign: id, foreignAlias: WebPromocionesProductos }
WebPromocion: { onDelete: CASCADE, local: webpromocion_id, foreign: id, foreignAlias: WebPromocionesProductos }
基于关系名称(左侧部分来自“:”),您可以使用任何$ webPromocion对象(
$webPromocion->getWebFoto(), ->getFlyer(), ->getProductos().
在任何webPromocion表查询中,您都可以
->innerJoin('wp.WebFoto wf'), ->innerJoin('wp.Flyer'), ->innerJoin('wp.Productos')
基于foreignAlias,您可以使用任何$ webFoto对象:
$webFoto->getWebPromociones()
并且在任何webFoto表查询中,您都可以执行
->innerJoin('wf.WebPromociones')
有一个很好的schema.yml,当你开发symfony1.4-doctrine应用程序时,它是至关重要的。 然后,您的customWebPromocionForm应如下所示:
class customWebPromocionForm extends WebPromocionForm {
public function configure() {
parent::configure();
unset($this['foto_id'],$this['flyer_id']);
$foto_object = $this->getObject()->getWebFoto();
$flyer_object = $this->getObject()->getFlyer();
$this->embedForm('foto_form', new customWebFotoForm($foto_object));
$this->embedForm('flyer_form', new customWebFotoForm($flyer_object));
// of course you should define customWebFotoForm, o simply use the default webFotoForm
}
}
这就是全部。它在您创建或编辑某些WebPromocion时有效。
永远记住:“懒人工作双重”,“el vago trabaja doble”。不要使用模式自动生成器。
SFMBE