symfony多对多关系循环属性而不是对象

时间:2010-12-17 16:33:04

标签: php symfony1 doctrine

我与链接表有多对多的关系。请参阅下面的(简化)架构。 根据教程(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

3 个答案:

答案 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。

Here's more from the Doctrine book

答案 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;

希望有助于解决您的问题!