Kdyby\Doctrine\ResultSet – neprojevující se změny v kolekci

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jasin755
Člen | 116
+
0
-

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
+
0
-

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
+
0
-

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
+
+1
-

imho ->add() bude ignorovat indexBy="id_shop", takze to bude pod jinym indexem, nez ocekavas…

jasin755
Člen | 116
+
0
-

Aha to mě vůbec nenapadlo. Předpokládám, že stačí volat volat ->set($key,$value) místo ->add($value)