свойства циклических связей symfony «многие ко многим» вместо объектов - PullRequest
1 голос
/ 17 декабря 2010

У меня есть отношение многие ко многим со связанной таблицей.Смотрите (упрощенную) схему ниже.Создано в соответствии с руководством (http://www.symfony -project.org / doctrine / 1_2 / ru / 05-Data-Fixtures # chapter_05_many_to_many )

Схема импортирует / строит правильно и phpmyadmin показываетвнешние ключи правильные.У меня сложилось впечатление, что впоследствии в шаблоне indexSuccess модуля 'locatie' я могу вызвать:

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 ]

1 голос
/ 17 декабря 2010

У вас нет Товаров, определенных как отношения в 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)

Также обратите внимание, что вам не нужно поле locatie_product_id в LocatieProduct.Если вы хотите, чтобы в этой таблице был один первичный ключ, я бы просто назвал его id.

Вот еще из книги Учения .

0 голосов
/ 17 декабря 2010

Добро пожаловать в 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;
}
0 голосов
/ 17 декабря 2010

Стратегия Symfony scape обертывает объекты при рендеринге, вы должны попытаться получить исходное значение, чтобы делать то, что вы хотите.Вот пример:

foreach($locatie->getRawValue()->getProducts() as $oProduct):
    echo sfOutputEscaper::unescape($oProduct->naam);
endforeach;

Надеюсь, что поможет решить вашу проблему!

...