Piotr Krajewski

Piotr Krajewski web application
programmer

Temat: formularz dodawania + relacja manyToMany

Witam,

mam problem - staram sie zrobic formularz dodawania wpisu, który zawiera pole manyToMany z inną tablą. Niestety non stop mi to nie wychodzi.

Poniżej kod:

Entity Attraction

<?php

namespace Explore\SiteBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;


/**
* Explore\SiteBundle\Entity\Attraction
*
* @ORM\Table(name="attractions")
* @ORM\Entity(repositoryClass="Explore\SiteBundle\Repository\AttractionRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Attraction
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var integer $category_id
* Relacja Category (1) : (n) Attraction - tworzy kolumne category_id - id kategori ktora nalezy do atrakcji
*
* @ORM\Column(name="category_id", type="integer")
* @ORM\OneToMany(targetEntity="Category", mappedBy="attractions")
*/
private $category_id;

/**
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="attraction")
* @ORM\JoinTable(name="attraction_tags",
* joinColumns={@ORM\JoinColumn(name="attraction_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}
* )
*/
private $tags;

public function getId(){
return $this->id;
}

public function getTags(){
return $this->tags;
}
}


Entity Tag:

<?php

namespace Explore\SiteBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Explore\SiteBundle\Entity\Tag
*
* @ORM\Table(name="tags")
* @ORM\Entity
*/
class Tag
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var string $tag
*
* @ORM\Column(name="tag", type="string", length=100)
*/
private $tag;

/**
* @ORM\ManyToMany(targetEntity="Attraction", mappedBy="tags")
*/
private $attraction;

public function __construct(){
$this->attraction = new \Doctrine\Common\Collections\ArrayCollection();
}

public function getId(){
return $this->id;
}

public function setTag($tag){
$this->tag = $tag;
}

public function getTag(){
return $this->tag;
}
}


Form:

<?php

namespace Explore\UserBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;


class AttractionType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options){
$builder->add('category_id', 'choice', array('choices' => array(1 => '1'), 'label' => 'Kategoria:'));
$builder->add('tags', 'text', array('label' => 'Tagi:'));
}

public function getName(){
return 'attraction';
}
}


Moje pytanie brzmi - jak dodac wpis "tags" do tabeli posredniej - "attraction_tags" w ktorej bedzie identyfikacja tabeli attractions i tabeli tags?

Poki co dostaje bledy typu:

Property "tags" is not public in class "Explore\SiteBundle\Entity\Attraction". Maybe you should create the method "setTags()"?


wiem ze nie mam takiej metody ale nie wiem czy powinienem ja stworzyc i tam zrobic inserta do tabeli attraction_tags czy w inny sposob ?
Daniel Żelazny

Daniel Żelazny Programista PHP,
Symfony

Temat: formularz dodawania + relacja manyToMany

Kieruj się sugestią komunikatu.

U mnie w przypadku obustronnej relacji manyToMany to wyglądałoby to tak


public function setAttractionTags( array $tags) {
$this->attraction_tags = $tags;

foreach ($tags as $tag){
$tag->setAttraction($this);
}
}


Ja przekazuję do powyższej metody odpowiednią tablicę , jeżeli nie obrabiasz obiektów Tag przed uruchomieniem tej metody jak ja, to pewnie jest to obiekt PersistentCollection (o ile dobrze pamiętam), więc ewentualnie zmień typ argumentu.Daniel Żelazny edytował(a) ten post dnia 27.01.12 o godzinie 12:25

Następna dyskusja:

Formularz edycji obiektu z ...




Wyślij zaproszenie do