php - Symfony2, one-to-many relation, creating new task with automatic new category -
i'm trying create new task , task assign pre-created categories. problem is, after submit form, automatically create new category same name, selected in category list, , symfony creates new relation them. just want assign category id task object, no create new category. here task object:
<?php namespace acme\taskbundle\entity; use doctrine\orm\mapping orm; use symfony\component\validator\constraints assert; /** * @orm\entity * @orm\table(name="tasks") */ class task { /** * @orm\id * @orm\column(type="integer") * @orm\generatedvalue(strategy="auto") */ protected $id; /** * @orm\column(type="string", length=200) * @assert\notblank( * message = "task cannot empty" * ) * @assert\length( * min = "3", * minmessage = "task short" * ) */ protected $task; /** * @orm\column(type="datetime") * @assert\notblank() * @assert\type("\datetime") */ protected $duedate; /** * @assert\true(message = "you need agree") */ protected $accepted; /** * @orm\manytoone(targetentity="category", inversedby="tasks", cascade={"persist"}) * @orm\joincolumn(name="category_id", referencedcolumnname="id") */ protected $category; public function gettask() { return $this->task; } public function settask($task) { $this->task = $task; } public function getduedate() { return $this->duedate; } public function setduedate(\datetime $duedate = null) { $this->duedate = $duedate; } public function getaccepted() { return $this->accepted; } public function setaccepted($accepted) { $this->accepted = (boolean) $accepted; } /** * id * * @return integer */ public function getid() { return $this->id; } /** * set category * * @param \acme\taskbundle\entity\category $category * @return task */ public function setcategory(\acme\taskbundle\entity\category $category = null) { $this->category = $category; return $this; } /** * category * * @return \acme\taskbundle\entity\category */ public function getcategory() { return $this->category; } }
category object:
<?php namespace acme\taskbundle\entity; use doctrine\orm\mapping orm; use symfony\component\validator\constraints assert; /** * @orm\entity * @orm\table(name="categories") */ class category { /** * @orm\id * @orm\column(type="integer") * @orm\generatedvalue(strategy="auto") */ protected $id; /** * @orm\column(type="string", length=200) * @assert\notnull(message="please select category", groups = {"adding"}) */ protected $name; /** * id * * @return integer */ public function getid() { return $this->id; } /** * set name * * @param string $name * @return category */ public function setname($name) { $this->name = $name; return $this; } /** * name * * @return string */ public function getname() { return $this->name; } public function __tostring() { return strval($this->name); } }
my db table task:
id | task | duedate | category_id (here creating doctrine automatic foreign keys between task , category)
and db table categories:
id | name +-------------------+ 1 | main category 2 | second category
and if create task, i.e. main category, add new task db , add new category db name main category. result is:
task table: +----------------------------------------+ 1 | task name | 2013-09-27 00:00:00 | 3 categories table: +--------------------+ 1 | main category 2 | second category 3 | main category
expected results:
task table: +----------------------------------------+ 1 | task name | 2013-09-27 00:00:00 | 1 categories table: +--------------------+ 1 | main category 2 | second category
how can fix please?
update
tasktype form:
<?php namespace acme\taskbundle\form\type; use symfony\component\form\abstracttype; use symfony\component\form\formbuilderinterface; use symfony\component\optionsresolver\optionsresolverinterface; use acme\taskbundle\form\type\category; class tasktype extends abstracttype { public function setdefaultoptions(optionsresolverinterface $resolver) { $resolver->setdefaults(array( 'data_class' => 'acme\taskbundle\entity\task', 'cascade_validation' => true, )); } public function buildform(formbuilderinterface $builder, array $options) { $builder->add('task', 'text', array('label' => 'task')) ->add('duedate', 'date', array('label' => 'date')) ->add('category', new categorytype(), array('validation_groups' => array('adding'))) ->add('accepted', 'checkbox') ->add('save', 'submit', array('label' => 'send')); } public function getname() { return 'task'; } }
categorytype form:
<?php namespace acme\taskbundle\form\type; use symfony\component\form\abstracttype; use symfony\component\form\formbuilderinterface; use symfony\component\optionsresolver\optionsresolverinterface; class categorytype extends abstracttype { public function setdefaultoptions(optionsresolverinterface $resolver) { $resolver->setdefaults(array( 'data_class' => 'acme\taskbundle\entity\category', )); } public function buildform(formbuilderinterface $builder, array $options) { $builder->add('name', 'entity', array( 'class' => 'acmetaskbundle:category', 'query_builder' => function($repository) { return $repository->createquerybuilder('c')->orderby('c.id', 'asc'); }, 'property' => 'name', 'empty_value' => 'choose something', )); } public function getname() { return 'category'; } }
first of have define unique
column "name" category (orm\column) avoid db inconsistence:
class category { [...] /** * @orm\column(type="string", length=200, unique=true) * @assert\notnull(message="please select category", groups = {"adding"}) */ protected $name;
then add persistent category task have find , attach entity, so:
// find category $category = $this->getdoctrine()->getmanager()->getrepository('acmetaskbundle:category')->findbyname("category name"); // add task $mytask->setcategory($category);
Comments
Post a Comment