如何在Symfony中显示一对多关系


How to display a One to Many relationship in Symfony

嗨,我正在用Symfony写一个小的Web应用程序。

两个实体之间有一对多的关系。

实体一:

/**
 * @ORM'Entity
 * @ORM'Table(name="Helfer")
 */
class Helfer {
    /**
     * @ORM'Column(type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM'Column(type="string")
     * @Assert'NotBlank()
     */
    protected $name;
    /**
     * @ORM'Column(type="string")
     * @Assert'NotBlank()
     */
    protected $lastName;
    /**
     * @ORM'Column(type="string")
     */
    protected $tel;
    /**
     * @ORM'Column(type="string")
     * @Assert'NotBlank()
     * @Assert'Email()
     */
    protected $email;
    /**
     * @ORM'Column(type="string")
     */
    protected $organisation;
    /**
     * @ORM'Column(type="integer")
     * @Assert'NotBlank()
     * @Assert'Range(min=6, minMessage="Du musst mindestens 6 Jahre Alt sein um bei uns helfen zu können.")
     */
    protected $age;
    /**
     * @ORM'OneToMany(targetEntity="Aufgaben", mappedBy="helfer", cascade={"persist","remove"})
     */
    protected $aufgaben;
    /**
     * @ORM'OneToMany(targetEntity="Zeiten", mappedBy="helfer", cascade={"persist","remove"})
     */
    protected $zeiten;
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->aufgaben = new 'Doctrine'Common'Collections'ArrayCollection();
        $this->zeiten = new 'Doctrine'Common'Collections'ArrayCollection();
    }
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set name
     *
     * @param string $name
     * @return Helfer
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }
    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * Set lastName
     *
     * @param string $lastName
     * @return Helfer
     */
    public function setLastName($lastName)
    {
        $this->lastName = $lastName;
        return $this;
    }
    /**
     * Get lastName
     *
     * @return string 
     */
    public function getLastName()
    {
        return $this->lastName;
    }
    /**
     * Set tel
     *
     * @param string $tel
     * @return Helfer
     */
    public function setTel($tel)
    {
        $this->tel = $tel;
        return $this;
    }
    /**
     * Get tel
     *
     * @return string 
     */
    public function getTel()
    {
        return $this->tel;
    }
    /**
     * Set email
     *
     * @param string $email
     * @return Helfer
     */
    public function setEmail($email)
    {
        $this->email = $email;
        return $this;
    }
    /**
     * Get email
     *
     * @return string 
     */
    public function getEmail()
    {
        return $this->email;
    }
    /**
     * Set organisation
     *
     * @param string $organisation
     * @return Helfer
     */
    public function setOrganisation($organisation)
    {
        $this->organisation = $organisation;
        return $this;
    }
    /**
     * Get organisation
     *
     * @return string 
     */
    public function getOrganisation()
    {
        return $this->organisation;
    }
    /**
     * Set age
     *
     * @param integer $age
     * @return Helfer
     */
    public function setAge($age)
    {
        $this->age = $age;
        return $this;
    }
    /**
     * Get age
     *
     * @return integer 
     */
    public function getAge()
    {
        return $this->age;
    }
    /**
     * Add aufgaben
     *
     * @param 'DLRG'HelferBundle'Entity'Aufgaben $aufgaben
     * @return Helfer
     */
    public function addAufgaben('DLRG'HelferBundle'Entity'Aufgaben $aufgaben)
    {
        $this->aufgaben[] = $aufgaben;
        return $this;
    }
    /**
     * Remove aufgaben
     *
     * @param 'DLRG'HelferBundle'Entity'Aufgaben $aufgaben
     */
    public function removeAufgaben('DLRG'HelferBundle'Entity'Aufgaben $aufgaben)
    {
        $this->aufgaben->removeElement($aufgaben);
    }
    /**
     * Get aufgaben
     *
     * @return 'Doctrine'Common'Collections'Collection 
     */
    public function getAufgaben()
    {
        return $this->aufgaben;
    }
    /**
     * Add zeiten
     *
     * @param 'DLRG'HelferBundle'Entity'Zeiten $zeiten
     * @return Helfer
     */
    public function addZeiten('DLRG'HelferBundle'Entity'Zeiten $zeiten)
    {
        $this->zeiten[] = $zeiten;
        return $this;
    }
    /**
     * Remove zeiten
     *
     * @param 'DLRG'HelferBundle'Entity'Zeiten $zeiten
     */
    public function removeZeiten('DLRG'HelferBundle'Entity'Zeiten $zeiten)
    {
        $this->zeiten->removeElement($zeiten);
    }
    /**
     * Get zeiten
     *
     * @return 'Doctrine'Common'Collections'Collection 
     */
    public function getZeiten()
    {
        return $this->zeiten;
    }
}

实体二:

 /**
 * @ORM'Entity
 * @ORM'Table(name="Aufgaben")
 */
class Aufgaben {
    /**
     * @ORM'Column(type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM'Column(type="string")
     */
    protected $name;
    /**
     * @ORM'Column(type="string")
     */
    protected $beschreibung;
    /**
     * @ORM'ManyToOne(targetEntity="Helfer", inversedBy="aufgaben")
     * @ORM'JoinColumn(name="helfer_aufgaben_id", referencedColumnName="id")
     */
    protected $helfer;
    /**
     * @ORM'OneToMany(targetEntity="Zeiten", mappedBy="aufgaben", cascade={"persist","remove"})
     */
    protected $zeiten;
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->zeiten = new 'Doctrine'Common'Collections'ArrayCollection();
    }
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set name
     *
     * @param string $name
     * @return Aufgaben
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }
    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * Set beschreibung
     *
     * @param string $beschreibung
     * @return Aufgaben
     */
    public function setBeschreibung($beschreibung)
    {
        $this->beschreibung = $beschreibung;
        return $this;
    }
    /**
     * Get beschreibung
     *
     * @return string 
     */
    public function getBeschreibung()
    {
        return $this->beschreibung;
    }
    /**
     * Set helfer
     *
     * @param 'DLRG'HelferBundle'Entity'Helfer $helfer
     * @return Aufgaben
     */
    public function setHelfer('DLRG'HelferBundle'Entity'Helfer $helfer = null)
    {
        $this->helfer = $helfer;
        return $this;
    }
    /**
     * Get helfer
     *
     * @return 'DLRG'HelferBundle'Entity'Helfer 
     */
    public function getHelfer()
    {
        return $this->helfer;
    }
    /**
     * Add zeiten
     *
     * @param 'DLRG'HelferBundle'Entity'Zeiten $zeiten
     * @return Aufgaben
     */
    public function addZeiten('DLRG'HelferBundle'Entity'Zeiten $zeiten)
    {
        $this->zeiten[] = $zeiten;
        return $this;
    }
    /**
     * Remove zeiten
     *
     * @param 'DLRG'HelferBundle'Entity'Zeiten $zeiten
     */
    public function removeZeiten('DLRG'HelferBundle'Entity'Zeiten $zeiten)
    {
        $this->zeiten->removeElement($zeiten);
    }
    /**
     * Get zeiten
     *
     * @return 'Doctrine'Common'Collections'Collection 
     */
    public function getZeiten()
    {
        return $this->zeiten;
    }
}

我的数据库在Aufgaben表中有条目。现在我的用户应该在helper .php中输入他们的名称和属性。那么用户应该从Aufgaben实体中选择一些值。

我尝试将Aufgaben.php中的值添加到集合中。

class HelferType extends AbstractType {
private $aufgaben;
public function __construct($aufgaben) {
    $this->aufgaben = $aufgaben;
}
/**
 *
 * @param FormBuilderInterface $builder         
 * @param array $options            
 */
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add ( 'name' )->add ( 'lastName' )->add ( 'tel' )->add ( 'email' )->add ( 'organisation' )->add ( 'age' );
    $builder->add ( 'aufgaben', 'collection', array (
            'type' => 'choice',
            'options' => array (
                    'choices' => $this->aufgaben 
            ) 
    ) );
}

但是这段代码不起作用。

有什么想法吗?

工作流程应该是:

  1. 输入用户信息
  2. 从Aufgaben.php中选择一个或多个值
  3. 保存所有

Thanks in advance

根据您的具体需要,一个可能的解决方案是使用实体表单类型。

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add ( 'name' )->add ( 'lastName' )->add ( 'tel' )->add ( 'email' )->add ( 'organisation' )->add ( 'age' );
    $builder->add ( 'aufgaben', 'entity', array (
            'class' => 'YourBundle:Aufgaben',
            'multiple' => true,
            'property' => 'name',
            'choices' => $this->aufgaben
        )
    );
}

这会在你的HTML中产生一个SELECT标签

也许这个和这个可以帮到你。

我解决这种情况覆盖__toString()方法在我的实体文件,而不是存储库文件。