gpt4 book ai didi

symfony - 使用 Sonata_type_collection 处理一对多关系的问题

转载 作者:行者123 更新时间:2023-12-01 02:31:50 24 4
gpt4 key购买 nike

我有一个相当常见的用例,我正在尝试实现它,但遇到了 Symfony Sonata Admin Bundle (ORM) 的一些问题。我的模型在 Facility 和 Sport 之间建立了关系,该关系基于三个实体类:Sport、Facility 和 SportsFacility。我跟着例子http://sonata-project.org/bundles/doctrine-orm-admin/master/doc/reference/form_field_definition.html#advanced-usage-one-to-many并在以下类中定义(仅相关部分)。

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;
}
}

在我的 FacilityAdmin 类(class)中,我有:
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();
}

当我尝试添加新关系时,出现以下错误:
“array or\Traversable”类型的预期参数,“Clarity\CoachTimeBundle\Entity\SportsFacility”在“vendor/sonata-project/admin-bundle/Sonata/AdminBundle/Form/EventListener/ResizeFormListener.php at line 88”中给出

最佳答案

终于找到问题所在;在您的类(class) Facility 中,您为奏鸣曲添加了缺少的方法,但它不应该像您认为的那样(是的):

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

我猜 addSport()是添加 SportsFacility 的新实例的默认原则生成方法到收藏。

这是由于奏鸣曲如何生成添加新实体的方法,这与教义的做法不同:
//file: Sonata/AdminBundle/Admin/AdminHelper.php
public function addNewInstance($object, FieldDescriptionInterface $fieldDescription)
{
...
$method = sprintf('add%s', $this->camelize($mapping['fieldName']));
...
}

有人收到 the same problem但文档没有发展

关于symfony - 使用 Sonata_type_collection 处理一对多关系的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12691345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com