Свойства циклических связей symfony "многие ко многим" вместо объектов

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

Схема импортирует / строит правильно, а 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 ответа

Решение

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

Вот еще из книги Доктрины.

Добро пожаловать в Stack Overflow, Томво.

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;
}

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

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

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

Другие вопросы по тегам