У меня есть два объекта, где каждый Product может иметь связанные с ним объекты oneToMany Aspect.
Поскольку таблица «Продукты» очень большая, я использую bigint
для ее идентификатора, и, следовательно, я пытаюсь создать составной ключ для Aspect, чтобы использовать идентификатор продукта и smallint
(который я пытаюсь увеличить с помощью Product#aspectsCount
). Однако я получаю исключение ContextErrorException:
Примечание: Неопределенный индекс: аспект
Мои сущности такие, как показано ниже (первоначально я пробовал indexBy="id")
в надежде использовать числовой идентификатор Aspect, но я не могу заставить это работать, поэтому использовал name
ниже, чтобы быть более согласованным с примерами, которые я ' читал в инете):
Продукт
class Product
{
/**
* @ORM\Column(type="bigint", options={"unsigned"=true})
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="Aspect", mappedBy="product", cascade={"all"}, indexBy="name")
*/
private $aspects;
/**
* @ORM\Column(name="aspectsCount", type="smallint", options={"unsigned"=true}, nullable=false)
*/
private $aspectsCount;
public function __construct()
{
$this->aspects = new ArrayCollection();
$this->setCreateDT(new \Datetime);
$this->setUpdateDT(new \Datetime);
$this->aspectsCount = 0;
}
/**
* Add aspect
*
* @param \AppBundle\Entity\Aspect $aspect
*
* @return product
*/
public function addAspect($name)
{
$aspect = new Aspect($this, $name);
$this->aspects[$name] = $aspect;
return $this;
}
/**
* Remove aspect
*
* @param \AppBundle\Entity\Aspect $aspect
*/
public function removeAspect(\AppBundle\Entity\Aspect $aspect)
{
$this->aspects->removeElement($aspect);
$this->setAspectsCount($this->aspectsCount-1);
}
}
Сущность аспекта
class Aspect
{
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Product", inversedBy="aspects")
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
*/
private $product;
/**
* @ORM\Id
* @ORM\Column(type="smallint", options={"unsigned"=true}, nullable=false)
*/
private $id;
/**
* @ORM\Column(name="name", type="text")
*/
private $name;
public function __construct($product, $name)
{
$product->setAspectsCount($product->getAspectsCount()+1);
$this->product = $product;
$this->id = $product->getAspectsCount();
$this->name = $name;
}
}
В более широком смысле, если другая таблица должна существовать "под" Aspect, как можно установить такую связь? Будет ли Doctrine обрабатывать составной ключ внутри или мне нужно будет сделать что-то вроде:
class Aspect_subtype
{
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Product")
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
*/
private $product;
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Aspect")
* @ORM\JoinColumn(name="aspect_id", referencedColumnName="id")
*/
private $aspect;
/**
* @ORM\Id
* @ORM\Column(type="smallint", options={"unsigned"=true}, nullable=false)
*/
private $id;
/**
* @ORM\Column(name="name", type="text")
*/
private $name;
// etc...
}
Notice: Undefined index: aspect
где эта ошибка - person Waqar Haider   schedule 09.01.2017$this->setCreateDT(new \Datetime); $this->setUpdateDT(new \Datetime);
и `$product-›setAspectsCount($product-›getAspectsCount()+1);`, но они нигде не определены - person Waqar Haider   schedule 09.01.2017getAspectsCount()+1
(и связанный с ним) используется для хранения счетчика в каждом продукте, поэтому каждый новый аспект для элемента имеет увеличенное целое число для идентификатора. - person Bendy   schedule 10.01.2017