Problems using sonata_type_collection for One-Many-One relationship

I have a fairly common use case that I am trying to implement, but I am encountering some issues related to the Admin Symanty Sonata (ORM) package. My model has a relationship between Facility and Sport, which is based on three entity classes: Sport, Facility, and SportsFacility. I followed the example of http://sonata-project.org/bundles/doctrine-orm-admin/master/doc/reference/form_field_definition.html#advanced-usage-one-to-many and was defined in the following classes (only for the relevant parts )

class Sport { /** * Bidirectional - Many facilies are related to one sport * * @ORM\OneToMany(targetEntity="SportsFacility", mappedBy="sport") */ protected $facilities; public function getFacilities() { return $this->facilities; } public function setFacilities($facilities) { $this->facilities = $facilities; return $this; } } class Facility { /** * Bidirectional - Many sports are related to one facility * * @ORM\OneToMany(targetEntity="SportsFacility", mappedBy="facility") */ protected $sports; public function getSports() { return $this->sports; } public function setSports($sportsFacilities) { $this->sports = $sportsFacilities; return $this; } public function addSports($sportsFacilities) { $this->sports = $sportsFacilities; return $this; } } class SportsFacility { /** * @var integer $sportsFacilityId * * @ORM\Column(name="sportsFacilityId", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $sportsFacilityId; /** * Bidirectional - Many Sports are related to one Facility (OWNING SIDE) * * @ORM\ManyToOne(targetEntity="Sport", inversedBy="facilities")) * @ORM\JoinColumn(name="sportId", referencedColumnName="sportId")) */ protected $sport; /** * Bidirectional - Many Facilities are related to one Sport (OWNING SIDE) * * @ORM\ManyToOne(targetEntity="Facility", inversedBy="sports")) * @ORM\JoinColumn(name="facilityId", referencedColumnName="facilityId")) */ protected $facility; public function getSportsFacilityId() { return $this->sportsFacilityId; } public function setSportsFacilityId($sportsFacilityId) { $this->sportsFacilityId = $sportsFacilityId; return $this; } public function getSport() { return $this->sport; } public function setSport($sport) { $this->sport = $sport; return $this; } public function getFacility() { return $this->facility; } public function setFacility($facility) { $this->facility = $facility; return $this; } } 

In my FacilityAdmin class, I have:

 protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add('name') ->with('Sports') ->add('sports', 'sonata_type_collection', array('by_reference' => false), array( 'edit' => 'inline', 'inline' => 'table', )) ->end(); } 

When I try to add a new relation, I get the following error: The expected argument of type "array or \ Traversable", "Clarity \ CoachTimeBundle \ Entity \ SportsFacility", given in the section "vendor / sonata-project / admin-bundle / Sonata / AdminBundle / Form / EventListener / ResizeFormListener.php on line 88 "

+4
source share
1 answer

Finally, we found that we have a problem; in your Facility class, you added a missing method for sonata, but it should not do what you think it should do (yup yup):

 class Facility { ... /** * Alias for sonata */ public function addSports($sportFacility) { return $this->addSport($sportFacility); } } 

I assume addSport() is the default generated doctrine method to add a new instance of SportsFacility to the collection.

This is due to how the sonata generates a method for adding a new object that is different from the doctrine:

 //file: Sonata/AdminBundle/Admin/AdminHelper.php public function addNewInstance($object, FieldDescriptionInterface $fieldDescription) { ... $method = sprintf('add%s', $this->camelize($mapping['fieldName'])); ... } 

Someone got the same problem , but the documentation did not develop

+3
source

Source: https://habr.com/ru/post/1437387/


All Articles