Неизвестный связанный компонент класса с наследованием Doctrine, Symfony 1.4 - PullRequest
1 голос
/ 04 июля 2011

У меня есть проект Symfony 1.4 для отображения products в представлении продукта category.Продукты можно просматривать в разных категориях, поэтому у меня есть отношение «многие ко многим» между продуктом и категорией.

У меня также есть различные типы продуктов, поэтому я использовал наследование Doctrine, чтобы определить их, поскольку большинство из них имеют много общегоиз тех же свойств.

Теперь у меня проблема в том, что при попытке добавить товар в категорию я получаю сообщение об ошибке:

Unknown record property / related component "CategoriesFeaturedIn" on "MultiProduct"

CategoriesFeaturedIn - это свойство в Productон содержит категории, в которых он находится, как определено в схеме Doctrine.

MultiProduct наследует от Product, поэтому должно иметь это свойство yes?

Я опубликую ниже мою схему и код, который я используюдля добавления товара в категорию.Надеюсь, кто-то может помочь, и я могу предоставить любую дополнительную информацию, как необходимую.

-

Схема: (не весь файл)

Category:
  actAs:
    Sluggable:
      fields: [title]
  columns:
    id:
      type:             integer
      primary:          true
      notnull:          true
      autoincrement:    true
    title:
      type:             string(255)
      notnull:          true
    image:
      type:             string(255)
    store_id:
      type:             integer
      notnull:          true
    sort_order:
      type:             integer
  relations:
    Store:
      class:            Store
      local:            store_id
      onDelete:         CASCADE
      foreignAlias:     Categories
    Parents:
      class:            Category
      refClass:         CategoryCategory
      foreign:          parent_category_id
      foreignAlias:     Subcategories

CategoryFeaturedProduct:
  columns:
    category_id:
      type:             integer
      primary:          true
    product_id:
      type:             integer
      primary:          true
  relations:
    Category:
      foreignAlias:     FeaturedProducts
      onDelete:         CASCADE
    Product:
      foreignAlias:     CategoriesFeaturedIn
      onDelete:         CASCADE

Product:
  actAs:
    Sluggable:
      fields: [title]
  columns:
    id:
      type:             integer
      primary:          true
      notnull:          true
      autoincrement:    true
    title:
      type:             string(255)
    description:
      type:             string(255)
    link:
      type:             string(255)
    image:
      type:             string(255)
    large_image:
      type:             string(255)
    featured_image:
      type:             string(255)
    sku:
      type:             string(64)
    mpid:
      type:             string(64)
    stock:
      type:             integer
    price:
      type:             decimal
    rrp:
      type:             decimal
    was_price:
      type:             decimal
    rating:
      type:             decimal
    sort_order:
      type:             integer
    promotion_id:
      type:             integer
    manufacturer_id:
      type:             integer
      notnull:          true
  relations:
    Promotion:
      class:            Promotion
      local:            promotion_id
      onDelete:         SET NULL
      foreignAlias:     Products
    Manufacturer:
      class:            Manufacturer
      local:            manufacturer_id
      onDelete:         CASCADE
      foreignAlias:     Products
    Categories:
      class:            Category
      refClass:         ProductCategory
      foreignAlias:     Products
    CategoriesFeaturedIn:
      class:            Category
      refClass:         CategoryFeaturedProduct
      foreignAlias:     FeaturedProducts

MultiProduct:
  inheritance:
    extends:            Product
    type:               column_aggregation
    keyField:           type
    keyValue:           2

Код:

$product = ProductTable::getInstance()->find($prod_id);
$category = CategoryTable::getInstance()->find($cat_id);
$product->addCategoryFeaturedIn($category);

Класс продукции:

public function addCategoryFeaturedIn($category)
{
    $this->CategoriesFeaturedIn[] = $category;
}

1 Ответ

0 голосов
/ 08 июля 2011

Мне действительно удалось решить эту проблему, хотя я не совсем уверен в ответе, но я сделал две вещи, и все сработало.

Сначала я изменил порядок файла схемы, чтобы он выглядел так:

Category:
  actAs:
    Sluggable:
      fields: [title]
  columns:
    id:
      type:             integer
      primary:          true
      notnull:          true
      autoincrement:    true
    title:
      type:             string(255)
      notnull:          true
    image:
      type:             string(255)
    store_id:
      type:             integer
      notnull:          true
    sort_order:
      type:             integer
  relations:
    Store:
      class:            Store
      local:            store_id
      onDelete:         CASCADE
      foreignAlias:     Categories
    Parents:
      class:            Category
      refClass:         CategoryCategory
      foreign:          parent_category_id
      foreignAlias:     Subcategories

Product:
  actAs:
    Sluggable:
      fields: [title]
  columns:
    id:
      type:             integer
      primary:          true
      notnull:          true
      autoincrement:    true
    title:
      type:             string(255)
    description:
      type:             string(255)
    link:
      type:             string(255)
    image:
      type:             string(255)
    large_image:
      type:             string(255)
    featured_image:
      type:             string(255)
    sku:
      type:             string(64)
    mpid:
      type:             string(64)
    stock:
      type:             integer
    price:
      type:             decimal
    rrp:
      type:             decimal
    was_price:
      type:             decimal
    rating:
      type:             decimal
    sort_order:
      type:             integer
    promotion_id:
      type:             integer
    manufacturer_id:
      type:             integer
      notnull:          true
  relations:
    Promotion:
      class:            Promotion
      local:            promotion_id
      onDelete:         SET NULL
      foreignAlias:     Products
    Manufacturer:
      class:            Manufacturer
      local:            manufacturer_id
      onDelete:         CASCADE
      foreignAlias:     Products
    Categories:
      class:            Category
      refClass:         ProductCategory
      foreignAlias:     Products
    CategoriesFeaturedIn:
      class:            Category
      refClass:         CategoryFeaturedProduct
      foreignAlias:     FeaturedProducts

MultiProduct:
  inheritance:
    extends:            Product
    type:               column_aggregation
    keyField:           type
    keyValue:           2

CategoryFeaturedProduct:
  columns:
    category_id:
      type:             integer
      primary:          true
    product_id:
      type:             integer
      primary:          true
  relations:
    Category:
      foreignAlias:     FeaturedProducts
      onDelete:         CASCADE
    Product:
      foreignAlias:     CategoriesFeaturedIn
      onDelete:         CASCADE

Я также изменил свой метод Product следующим образом:

public function addCategory($category)
{
    $this->getCategories()->add($category);
}

Я предполагаю, что переупорядочение файла схемы - это то, что действительно помогло, и исправила эту проблему, которая предполагает, что вам нужноЧтобы определить отношения в схеме после , вы определили фактические связанные таблицы.

Изменение метода, вероятно, не повлияло на это, но его стоит отметить, так как это то, что я считаюлучший способ добавить отношения «многие ко многим».

...