I am creating an Asset Management Web App with Symfony 3.3.
I have two entities, Asset and User.
User:
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User extends BaseUser
{
/**
* @ORM\ManyToMany(targetEntity="Asset", mappedBy="users")
*/
private $assets;
/**
* Add asset
*
* @param \AppBundle\Entity\Asset $asset
*
* @return User
*/
public function addAsset(\AppBundle\Entity\Asset $asset)
{
$this->assets[] = $asset;
return $this;
}
/**
* Remove asset
*
* @param \AppBundle\Entity\Asset $asset
*/
public function removeAsset(\AppBundle\Entity\Asset $asset)
{
$this->assets->removeElement($asset);
}
/**
* Get assets
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getAssets()
{
return $this->assets;
}
}
Asset:
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Asset
*
* @ORM\Table(name="asset")
* @ORM\Entity(repositoryClass="AppBundle\Repository\AssetRepository")
*/
class Asset
{
/**
* @ORM\ManyToMany(targetEntity="User", inversedBy="assets")
* @ORM\JoinTable(name="asset_user")
*/
private $users;
/**
* Add user
*
* @param \AppBundle\Entity\User $user
*
* @return Asset
*/
public function addUser(\AppBundle\Entity\User $user)
{
$this->users[] = $user;
return $this;
}
/**
* Remove user
*
* @param \AppBundle\Entity\User $user
*/
public function removeUser(\AppBundle\Entity\User $user)
{
$this->users->removeElement($user);
}
/**
* Get users
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getUsers()
{
return $this->users;
}
}
They have a Many to Many relationship. If I add Users in an Asset, everything is fine, but if I add assets in a user. It won't persist.
Adding my Form types:
AssetUserAssignType:
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class AssetUserAssignType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('users', CollectionType::class, array(
'label' => 'Custodians',
'entry_type' => EntityType::class,
'entry_options' => array( 'class'=>'AppBundle:User',
'label'=>false,
'choice_label'=>'employee_number',
),
'allow_delete' =>true,
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false,
'attr'=> array('class'=>'user_collection'),
));
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Asset'
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'appbundle_assetassign';
}
}
UserAssetAssignType:
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class UserAssetAssignType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('assets', CollectionType::class, array(
'label' => 'Assets',
'entry_type' => EntityType::class,
'entry_options' => array( 'class'=>'AppBundle:Asset',
'label'=>false,
'choice_label'=>'code',
),
'allow_delete' =>true,
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false,
'attr'=> array('class'=>'asset_collection'),
));
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\User'
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'appbundle_assetassign';
}
}
If you need more code, I'll paste them here also, but I think this is enough.