Свойства циклических связей 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;
Надеюсь, что это поможет решить вашу проблему!