1 Отредактировано antifreez (2016-11-06 11:47:31)

Тема: Помогите, запутался в 4 соснах

Есть каталог товаров разных категорий.

Есть 4 сущности. Категория (товаров), Параметр для категории, Продукт  и Параметр продукта.

Категория(всего два поля, id и title)

  • ID

  • Название категории товаров

(напр. Одежда, Обувь, Аксессуары и пр.)

ПараметрКатегории

  • ID

  • категория (сущность Категория чей это параметр)

  • название параметра

  • прочие вспомогательные поля

Например:
Уникальные параметры для каждой категории товаров, напр.:
Для категории #1 (Одежда): размер (#1), материал(#2), цвет(#3).
Для категории #2 (Обувь):   размер(#4), материал(#5), цвет(#6), тип застежки(#7).
Для категории #3 (Аксессуары):  назначение(#8), производитель(#9), описание(#10).


Продукт

  • ID

  • цена

  • категория (содержит сущность Категория)

  • параметры (коллекция сущностей Параметр для этого продукта)

Параметр

  • ID

  • продукт (содержит сущность Продукт чей это параметр)

  • параметр (содержит сущность ПараметраКатегории какой это параметр)

  • значение (содержит значение этого параметра)

Вот код моих сущностей.

Category:

namespace Pcads\AdsBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
* @ORM\Entity(repositoryClass="Pcads\AdsBundle\Entity\Repository\CategoryRepository")
* @ORM\Table(name="category")
* @ORM\HasLifecycleCallbacks()
*/

class Category{
 
    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */

    protected $id;
 
 
    /**
    * @ORM\Column(type="string", length=100)
    */

    protected $title;
 
    /**
    * @ORM\OneToMany(targetEntity="CategoryParam", mappedBy="category")
    */

    protected $params;

------------------------------------------------------------
CategoryParam

namespace Pcads\AdsBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
* @ORM\Entity(repositoryClass="Pcads\AdsBundle\Entity\Repository\CategoryParamRepository")
* @ORM\Table(name="category_param")
* @ORM\HasLifecycleCallbacks()
*/

class CategoryParam{
 
    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */

    protected $id;
 
 
    /**
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="params")
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
    */

    protected $category;
 
 
    /**
    * @ORM\Column(type="string", length=100)
    */

    protected $title;
 
 
    /**
    * @ORM\Column(type="array")
    */

    protected $variants;
 
 
    /**
    * @ORM\Column(type="boolean", options={"comment":"использовать только доступные варианты"})
    */

    protected $strictly;
 
 
    /**
    * @ORM\Column(type="boolean", options={"comment":"параметр используется как фильтр"})
    */

    protected $filter;

------------------------------------------------------------
AdProduct

namespace Pcads\AdsBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
* @ORM\Entity(repositoryClass="Pcads\AdsBundle\Entity\Repository\AdProductRepository")
* @ORM\Table(name="ad_product")
* @ORM\HasLifecycleCallbacks()
*/

class AdProduct{
 
 
    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */

    protected $id;
 
 
    /**
    * @ORM\Column(type="integer", options={"default":0})
    */

    protected $author;
 
 
    /**
    * @ORM\Column(type="integer", options={"comment":"цена в копейках"})
    */

    protected $price;
 
 
    /**
    * @ORM\ManyToOne(targetEntity="Category")
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
    */

    protected $category;
 
 
    /**
    * @ORM\Column(type="smallint")
    */

    protected $state;
 
 
    /**
    * @ORM\Column(type="datetime")
    */

    protected $created;
 
 
    /**
    * @ORM\Column(type="datetime")
    */

    protected $updated;
 
 
    /**
    * @ORM\OneToMany(targetEntity="Param", mappedBy="product")
    */

    protected $params;

------------------------------------------------------------
Param

namespace Pcads\AdsBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
* @ORM\Entity(repositoryClass="Pcads\AdsBundle\Entity\Repository\ParamRepository")
* @ORM\Table(name="param")
* @ORM\HasLifecycleCallbacks()
*/

class Param{
 
    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */

    protected $id;
 
    /**
    * @ORM\ManyToOne(targetEntity="AdProduct", inversedBy="params")
    * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
    */

    protected $product;
 
    /**
    * @ORM\ManyToOne(targetEntity="CategoryParam")
    * @ORM\JoinColumn(name="category_param_id", referencedColumnName="id")
    */

    protected $param;
 
    /**
    * @ORM\Column(type="text")
    */

    protected $val;

Правильно ли я указал типы связей между этими сущностями?

Поясните пожалуйста "на пальцах" что означают параметры mappedBy и inversedBy, читал так и не понял что в них указывается (сущность, свойство сущности, поле в таблице, таблица)?

Я хочу задавать свойства продукта при создании нового прямо через Объект продукта.
Уже на этапе создания фикстур вышли "косяки" такой схемы: чтобы создать новый продукт надо создать 3 объекта, и по новому объекту для каждого параметра продукта. Хотелось бы не задавать это всё отдельно, а указать прямо в сущность продукт. А при сохранении чтобы она сама насоздавала объекты Параметров и записала их в базу.

Или всё верно спроектировал, так и надо?