[FLOW3-general] One question about mm relation

Regine Rosewich regine.rosewich at hoellenberg.biz
Sat Feb 23 11:32:20 CET 2013


Hi Manfred,

only to be sure that everything possible has been tried out you should try
to end the transactions with a

$this->persistenceManager->persist(all)

Thus the doctrine-persistence must do anything or throw an error. If not
something with your doctrine installation might be wrong.

Regine 


> -----Ursprüngliche Nachricht-----
> Von: flow3-general-bounces at lists.typo3.org [mailto:flow3-general-
> bounces at lists.typo3.org] Im Auftrag von Manfred Rutschmann - VOLUMEN
> Werbe-/Internetagentur
> Gesendet: Freitag, 22. Februar 2013 18:55
> An: General discussion about FLOW3
> Betreff: Re: [FLOW3-general] One question about mm relation
> 
> 
> Hi Regine,
> 
> many thanks for your assistance. I have tried all the things you say,
> but nothing work. By Example:
> 
> Company: My Main object
> 
> 	/**
> 	 * The aktion
> 	 * @ORM\ManyToMany(inversedBy="company", cascade={"persist"})
> 	 * @var
> \Doctrine\Common\Collections\Collection<\Kunden\Domain\Model\Aktion>
> 	 */
> 	protected $aktion;
> 
> 
> 	public function __construct() {
> 		$this->aktion = new
> \Doctrine\Common\Collections\ArrayCollection();
> 	}
> 
> 
> 	/**
> 	 * Set the aktion
> 	 *
> 	 * @param
> \Doctrine\Common\Collections\Collection<\Kunden\Domain\Model\Aktion>
> $aktion
> 	 * @return void
> 	 */
> 	public function setAktion(\Doctrine\Common\Collections\Collection
> $aktion) {
> 		$this->aktion = $aktion;
> 	}
> 
> 
> 	/**
> 	 * Adds the given aktion.
> 	 *
> 	 * @param \Kunden\Domain\Model\Aktion $aktion
> 	 * @return void
> 	 */
> 	public function addAktion(\Kunden\Domain\Model\Aktion $aktion) {
> 		$this->aktion->add($aktion);
> 	}
> 
> 	/**
> 	 * Removes the given aktion
> 	 *
> 	 * @param \Kunden\Domain\Model\Aktion $aktion
> 	 * @return void
> 	 */
> 	public function removeAktion(\Kunden\Domain\Model\Aktion $aktion)
> {
> 		$this->aktion->removeElement($aktion);
> 	}
> 
> 	/**
> 	 * Returns all known aktionen
> 	 *
> 	 * @return
> \Doctrine\Common\Collections\Collection<\Kunden\Domain\Model\Aktion>
> 	 */
> 	public function getAktion() {
> 		return clone $this->aktion;
> 	}
> 
> 
> 
> 
> Now my aktion object:
> 
> 
> 
> 	/**
> 	 * The company
> 	 * @ORM\ManyToMany(mappedBy="aktion", cascade={"persist"})
> 	 * @var
> \Doctrine\Common\Collections\Collection<\Kunden\Domain\Model\Company>
> 	 */
> 	protected $company;
> 
> 
> 	/**
> 	 * Constructs this Aktion
> 	 *
> 	 */
> 	public function __construct() {
> 		$this->company = new
> \Doctrine\Common\Collections\ArrayCollection();
> 	}
> 
> 
> 
> 	/**
> 	 * Set the company
> 	 *
> 	 * @param
> \Doctrine\Common\Collections\Collection<\Kunden\Domain\Model\company>
> $company
> 	 * @return void
> 	 */
> 	public function
> setCompany(\Doctrine\Common\Collections\Collection $company) {
> 		$this->company = $company;
> 	}
> 
> 
> 	/**
> 	 * Adds the given company.
> 	 *
> 	 * @param \Kunden\Domain\Model\Company $company
> 	 * @return void
> 	 */
> 	public function addCompany(\Kunden\Domain\Model\Company $company)
> {
> 		$this->company->add($company);
> 	}
> 
> 	/**
> 	 * Removes the given company
> 	 *
> 	 * @param \Kunden\Domain\Model\Company $company
> 	 * @return void
> 	 */
> 	public function removeCompany(\Kunden\Domain\Model\Company
> $company) {
> 		$this->company->removeElement($company);
> 	}
> 
> 	/**
> 	 * Returns all known company
> 	 *
> 	 * @return
> \Doctrine\Common\Collections\Collection<\Kunden\Domain\Model\company>
> 	 */
> 	public function getCompany() {
> 		return clone $this->company;
> 	}
> 
> 
> 
> in my AktionController i do this:
> 
> 	/**
> 	 * createAction
> 	 * @param \Kunden\Domain\Model\Aktion $aktion
> 	 * @param \Kunden\Domain\Model\Company $company
> 	 * @return void
> 	 *
> 	 */
> 	public function createAction(\Kunden\Domain\Model\Aktion $aktion,
> \Kunden\Domain\Model\Company $company){
> 		$aktion->addCompany($company);
> 		$this->aktionRepository->add($aktion);
> 		$this->redirect("edit", "Company", NULL, array("company" =>
> $company));
> 	}
> 
> 
> 
> The create action gets two arguments, the new aktion and a related
> company. in this case only one company (many companies comes in a other
> controller). Then i add the company argument to the aktion. And for my
> understand must flow3 create a relation in
> kunden_domain_model_company_aktion_join for added company in the
> aktion. But all annotations for cascade, jointable or targetEntity in
> the aktion model are succesfull ignored...
> 
> Then in tried some other options:
> 
> targetEntity="\Kunden\Domain\Model\Company"
> JoinTable="kunden_domain_model_aktion_join"
> 
> Nothing.
> 
> I have no idea whats going wrong. doctrine:update brings no expection,
> the aktion is persisted, but the relation from this point is never
> created...?!
> 
> Thanks for your time!
> 
> Regards Manfred
> 
> 
> 
> Am 22.02.2013 um 16:43 schrieb Regine Rosewich
> <regine.rosewich at hoellenberg.biz>:
> 
> > Hi Manfred,
> >
> > your problem might be the missing persistence instructions in your
> > many-to-many parameter like
> >
> > * @ORM\ManyToMany\(inversedBy="...", cascade={"persist"})
> >
> > <<or "...cascade={"persist", "remove"}" or "...cascade={"all"}">>
> >
> > Thus you tell the persistence manager how to handle an object which
> is
> > added, updated or removed.
> >
> > Btw: I'm developing a large business-web-application with TYPO3/FLOW
> > and
> > ExtJS4 which unfortunately needs several one-to-many associations.
> > First I did it as you do by @ORM\ManyToMany... which worked
> > technically but did cause, under others,  performance problems with
> > large datasets. In the end I decided to solve my problems with
> > manually defined join classes (in your case this would be a class
> > "CompanyActions") and join the dependent classes with OneToMany joins
> > to that class. Beside the performance impact, this way has the
> > advantage that you are free to add additional properties to the join
> > class which conceptually do not belong to one of the dependent
> classes
> > (like for example a default action for a certain company)
> >
> > Regine
> >
> >> -----Ursprüngliche Nachricht-----
> >> Von: flow3-general-bounces at lists.typo3.org [mailto:flow3-general-
> >> bounces at lists.typo3.org] Im Auftrag von Manfred Rutschmann - VOLUMEN
> >> Werbe-/Internetagentur
> >> Gesendet: Freitag, 22. Februar 2013 14:07
> >> An: flow3-general at lists.typo3.org
> >> Betreff: [FLOW3-general] One question about mm relation
> >>
> >> Hi guys,
> >>
> >> one question about mm relation. I have two objects:
> >>
> >> Company
> >> Action
> >>
> >> Many Companys can have many Actions.
> >>
> >> I need access to the acions from the company context. But i need the
> >> access from Actions to the company to. Now i have the objects
> defnied
> >> as follow:
> >>
> >> Company:
> >>
> >>
> >> 	/**
> >> 	 * The action
> >> 	 * @ORM\ManyToMany(inversedBy="company")
> >> 	 * @var
> >> \Doctrine\Common\Collections\Collection<\Kunden\Domain\Model\Action>
> >> 	 */
> >> 	protected $action;
> >>
> >> Action:
> >>
> >> 	/**
> >> 	 * The company
> >> 	 * @ORM\ManyToMany(mappedBy="action")
> >> 	 * @var
> >>
> \Doctrine\Common\Collections\Collection<\Kunden\Domain\Model\Company>
> >> 	 */
> >> 	protected $company;
> >>
> >> This configuration gives me the following table:
> >> kunden_domain_model_company_action_join
> >>
> >> Now i create in my ActionController a new action. For this case i
> >> have only one company to assign:
> >>
> >> 	/**
> >> 	 * createAction
> >> 	 * @param \Kunden\Domain\Model\Action $action
> >> 	 * @param \Kunden\Domain\Model\Company $company
> >> 	 * @return void
> >> 	 *
> >> 	 */
> >> 	public function createAction(\Kunden\Domain\Model\Action $action,
> >> \Kunden\Domain\Model\Company $company){
> >>
> >> 		$collection = new
> >> \Doctrine\Common\Collections\ArrayCollection;
> >> 		$collection->add($company);
> >> 		$aktion->setCompany($collection);
> >>
> >> 		$this->aktionRepository->add($action);
> >> 		$this->redirect("edit", "Company", NULL, array("company" =>
> >> $company));
> >> 	}
> >>
> >> In this case no relation is created by flow3. To create a mm
> relation
> >> between two objects i have to do the following:
> >>
> >> 	/**
> >> 	 * createAction
> >> 	 * @param \Kunden\Domain\Model\Action $action
> >> 	 * @param \Kunden\Domain\Model\Company $company
> >> 	 * @return void
> >> 	 *
> >> 	 */
> >> 	public function createAction(\Kunden\Domain\Model\Action $action,
> >> \Kunden\Domain\Model\Company $company){
> >>
> >> 		$collection = new
> >> \Doctrine\Common\Collections\ArrayCollection;
> >> 		$collection->add($action);
> >> 		$company->setAction($collection);
> >>
> >>
> >> 		$this->aktionRepository->add($action);
> >> 		$this->companyRepository->update($company);
> >>
> >> 		$this->redirect("edit", "Company", NULL, array("company" =>
> >> $company));
> >> 	}
> >>
> >> Ist that right? I have update the company with the action as
> >> collection by hand?
> >>
> >> Many thanks for assistance!
> >>
> >> Regards Manfred Rutschmann
> >> _______________________________________________
> >> FLOW3-general mailing list
> >> FLOW3-general at lists.typo3.org
> >> http://lists.typo3.org/cgi-bin/mailman/listinfo/flow3-general
> >
> >
> > _______________________________________________
> > FLOW3-general mailing list
> > FLOW3-general at lists.typo3.org
> > http://lists.typo3.org/cgi-bin/mailman/listinfo/flow3-general
> 
> _______________________________________________
> FLOW3-general mailing list
> FLOW3-general at lists.typo3.org
> http://lists.typo3.org/cgi-bin/mailman/listinfo/flow3-general




More information about the FLOW3-general mailing list