обновление
Хорошо, поэтому я не упомянул проблему, с которой вы на самом деле столкнулись. Компонент формы, какой бы умной она ни была, будет пытаться вызывать методы получения и установки при загрузке / изменении данных формы. Поскольку ваша форма содержит ->add('companyUserPermissionMaps',...
, компонент формы вызовет getCompanyUserPermissionMaps
для вашей сущности (которая вернет, вероятно, в настоящее время, вероятно, пустую коллекцию) и попытается выполнить обратную запись в сущность с помощью setCompanyUserPermissionMaps
или add
/ * 1009. * вместо set
, если они присутствуют.
Поскольку ваше поле на самом деле ведет себя так, как будто оно содержит коллекцию объектов Company
, установка этих параметров на вашем объекте User
, очевидно, не удастся выполнить с помощьюсообщение об ошибке:
Ожидаемое значение типа «App \ Entity \ CompanyUserPermissionMap» для поля ассоциации «App \ Entity \ User # $ companyUserPermissionMaps», вместо этого получено «App \ Entity \ Company».
, что абсолютно логично. Итак, эту проблему можно решить разными способами. Один из способов, который вы, по-видимому, уже попробовали, - установить mapped
на false
, но вместо false
вы использовали 'false'
(обратите внимание на кавычки), что оценивается как true ... по иронии судьбы. Таким образом, чтобы использовать ваш подход, вы должны удалить цитаты. Тем не менее, я предлагаю другой подход, который я бы предпочел!
конец обновления
Мой общий совет - скрывать вещи, которые вы не хотите показывать. Таким образом, в вашем конструкторе форм вместо
->add('companyUserPermissionMaps', EntityType::class, [
'required' => true,
'class' => Company::class,
'label' => 'Compañia',
'multiple' => true,
'expanded' => false,
'choice_label' => 'legalName',
'mapped'=>'false'
])
, который, очевидно, уже не является полем, которое обрабатывает CompanyUserPermissionMaps
, а компаниями вместо этого - так что, очевидно, вы подозревали, что это семантически что-то другое, вам следует вернуться к User
сущности и задайте ей функцию getCompanies
вместо
public function getCompanies() {
return array_map(function ($map) {
return $map->getCompany();
}, $this->getCompanyUserPermissionsMaps());
}
public function addCompany(Company $company) {
foreach($this->companyUserPermissionMaps->toArray() as $map) {
if($map->getCompany() === $company) {
return;
}
}
$new = new CompanyUserPermissionMap();
$new->setCompany($company);
$new->setUser($this);
$this->companyUserPermissionMaps->add($new);
}
public function removeCompany(Company $company) {
foreach($this->companyUserPermissionMaps as $map) {
if($map->getCompany() == $company) {
$this->companyUserPermissionMaps->removeElement($map);
}
}
}
, тогда вы бы назвали поле companies
(т. Е. ->add('companies', ...)
) и действовали бы на Company
сущностях вместо этих надоедливых карт. (Мне также не очень нравится выставлять ArrayCollection
и другие внутренние объекты извне. Но, эй, это ваше решение.)
однако, если ваши Карты будут содержать больше значений в какой-то момент, вы на самом делеработать с картами в вашей форме, а не только с Company
сущностями.