Kdyby\Doctrine\ResultSet – neprojevující se změny v kolekci
- jasin755
- Člen | 116
Zdravím.
Pravděpodobně to bude dotaz nejlépe přímo pro @FilipProcházka, ale možná poradí i někdo jiný.
Mám takovýto kód, který pomocí QueryObjectu sestaví dotaz:
$query
->withProductAttributeShop($this->shop_facade->getCurrentShop())
->withAttributeGroupShop()
->orderByAttributeType();
$product_attributes = $this->entity_manager->getRepository('ProductAttribute')->fetch($query);
následně mi service zkontroluje zda pro každý shop existuje ProductAttributeShop, pokud ne tak jej vytvoří prázdný a přida do ProductAttribute
public function createMissionProductAttributeShop(\Kdyby\Doctrine\ResultSet $product_attributes){
$flush_need = FALSE;
foreach($product_attributes AS $product_attribute){
if(!($product_attribute instanceof ProductAttribute)){
throw new InvalidArgumentException('Očekávaná instance ProductAttribute');
}
$product_attribute_shop = $product_attribute->getCurrentProductAttributeShop();
if(empty($product_attribute_shop)){
$flush_need = TRUE;
$product_attribute->setProductAttributeShop(new ProductAttributeShop($this->shop_facade->getCurrentShop()));
}
}
return $flush_need;
}
pokud byl nejaky ProductAttributeShop vytvořený tak se vrací TRUE a provádí se flush(). ProductAttribute ma nastavenou caskádovou persistenci, takže vše projde bez problému záznam se v DB vytvoří, ale pokud začnu iterovat na ResultSetem a dotazuji se na getCurrentProductAttributeShop(), tak to nevrátí nic… Pokud stránku refreshnu, tak už je to ok, protože se záznamy vytvořili předtím.
Nevím zda dělam něco špatně nebo je něco špatně v ResultSetu nebo v samotné Doctrine, ale moc nevím jak z toho ven. Protože je celkem zajimavé, že když znova zalovám ->fetch($query) (tzn. měli by se záznamy vytáhnout znova z DB, tak to tam stejně není…) viz. níže:
//Vytvori chybejici ProductAttributeShop
if($this->product_service->createMissingProductAttributeShop($product_attributes)){
$this->entity_manager->flush();
$product_attributes = $this->entity_manager->getRepository('ProductAttribute')->fetch($query);
}
Děkuji za rady :)
- David Matějka
- Moderator | 6445
Tohle nebude chyba ResultSetu, ale asi spatne logiky v entite nebo spatneho
mapovani.
jak vypadaji metody getCurrentProductAttributeShop a setProductAttributeShop a
jak vypada relevantni mapovani?
- jasin755
- Člen | 116
Setter:
public function setProductAttributeShop(ProductAttributeShop $product_attribute_shop){
$this->product_attribute_shop->add($product_attribute_shop);
$product_attribute_shop->setProductAttribute($this);
}
Getter:
public function getCurrentProductAttributeShop(){
$product_attribute_shop = $this->product_attribute_shop->toArray();
if(!empty($product_attribute_shop[$this->getCurrentShopId()])){
return $product_attribute_shop[$this->getCurrentShopId()];
}else{
return NULL;
}
}
Mapovani v ProductAttribute:
/**
* @ORM\oneToMany(targetEntity="ProductAttributeShop", mappedBy="product_attribute",indexBy="id_shop", cascade={"persist","remove"})
* @var ProductAttributeShop
*/
private $product_attribute_shop;
Mapování v ProductAttributeShop:
/**
* @ORM\ManyToOne(targetEntity="ProductAttribute", inversedBy="product_attribute_shop")
* @ORM\JoinColumn(name="id_product_attribute", referencedColumnName="id_product_attribute", onDelete="CASCADE")
* @var ProductAttribute
*/
private $product_attribute;
- David Matějka
- Moderator | 6445
imho ->add()
bude ignorovat indexBy="id_shop"
,
takze to bude pod jinym indexem, nez ocekavas…