我与链接表有多对多的关系。请参阅下面的(简化)架构。 根据教程(http://www.symfony-project.org/doctrine/1_2/en/05-Data-Fixtures#chapter_05_many_to_many)
创建架构导入/构建正确,phpmyadmin显示外键正确。 我的印象是,之后在'locatie'模块的indexSuccess模板中我可以调用:
foreach($locatie->getProducts() as $oProduct):
echo $oProduct->naam;
endforeach;
但这不起作用,因为$ oProduct似乎不是一个对象,而是一个表示产品类中每个属性的字符串。 foreach只是循环第一个产品的属性而不是产品列表。 有人有什么建议吗?
模式
Locatie:
connection: doctrine
tableName: locatie
columns:
locatie_id:
type: integer(4)
fixed: false
unsigned: true
primary: true
autoincrement: true
naam:
type: string(255)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
LocatieProduct:
connection: doctrine
tableName: locatie_product
columns:
locatie_product_id:
type: integer(4)
fixed: false
unsigned: false
primary: true
autoincrement: true
locatie_id:
type: integer(4)
fixed: false
unsigned: true
primary: false
notnull: true
autoincrement: false
product_id:
type: integer(4)
fixed: false
unsigned: true
primary: false
notnull: true
autoincrement: false
relations:
Locatie:
local: locatie_id
foreign: locatie_id
foreignAlias: LocatieProducts
onDelete: CASCADE
Product:
local: product_id
foreign: product_id
foreignAlias: LocatieProducts
onDelete: CASCADE
Product:
connection: doctrine
tableName: product
columns:
product_id:
type: integer(4)
fixed: false
unsigned: true
primary: true
autoincrement: true
naam:
type: string(255)
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
答案 0 :(得分:1)
您没有将产品定义为Locatie上的关系。将架构更改为:
Locatie:
connection: doctrine
tableName: locatie #this isn't necssary, by the way
columns:
#etc
relations:
Products:
class: Product
type: many
refClass: LocatieProduct
local: locatie_id #the field on LocatieProduct that is an FK to the id of the current table (Locatie)
foreign: product_id #the field on LocatieProduct that is an FK to the id of the class (Product)
另请注意,您不需要LocatieProduct上的字段locatie_product_id。如果您确实希望该表具有单个主键,我只需将其命名为id。
答案 1 :(得分:0)
欢迎使用Stack Overflow,tomvo。
ORM为您的中级或“通过”类创建一个模型,因此您有一个名为 LocatieProduct 的额外类,您并不期望这样。你可以这样使用它:
foreach($locatie->getLocatieProducts()->getProduct() as $oProduct):
echo $oProduct->naam;
endforeach;
学习如何访问相关对象的最佳方法是阅读lib/model/doctrine/base/
中生成的代码。
为方便起见,我经常为模型添加其他方法。例如,在lib/model/doctrine/Locatie.class.php
中,您可以添加一个更符合您期望的函数:
public function getProducts() {
$a = array();
foreach ($this->getLocatieProducts()->getProduct() as $p) {
$a[] = $p;
}
return $a;
}
答案 2 :(得分:-1)
Symfony scape策略在渲染时包装对象,您应该尝试获取原始值以执行您想要的操作。这是一个例子:
foreach($locatie->getRawValue()->getProducts() as $oProduct):
echo sfOutputEscaper::unescape($oProduct->naam);
endforeach;
希望有助于解决您的问题!