@e-hot

Отображение сущностей, их связей между собой. Как обращаться к ним из классов форм, в том числе внедренных?

Ситуация:
1. Отображение связей между сущностями - в тестовом режиме из контроллера
можно брать родительские сущности и через их свойства-поля запрашивать связанные (дочерние)
сущности и, соответственно, их любые свойства-поля - все настроено, все работает - все данные берутся
из соответствующих таблиц БД.
2. Теперь я пытаюсь на отображения сущностей и отображения связей между сущностями
нахлобучить обращения из класса(ов) форм или другими словами: завязать работу форм (классов форм) на
имеющиеся связанные сущности - вот здесь у меня и происходит клин. Читаю вдоль и поперек
доки по формам и внедренным формам (субформам в качестве коллекции) и не могу осмыслить механизм того -
и сам ВОПРОС:
как поверх отображений связей в сущностях указывать связи между формами, базовой и
внедренной в нее. На форумах пишут, юзай документацию - там все есть, да, в
документации есть про отображение связей - отдельно, про формы - отдельно. В доке по Доктрине при
использовании коллекции коллекцию размещают на обратной стороне связи сущностей. В доке о формах и коллекиях,
коллекцию размещают на прямой стороне отношений между формами. Не могу
понять: для того, чтобы внедренные формы работали в базовой форме, я должен в
родительскую сущность вводить дополнительное поле-свойство, чтобы через него
впоследствии связывать коллекцию дочерних сущностей? Или я должен просто
модифицировать имеющееся поле в родительской сущности под связывание? Если я правильно понял, то
уже на уровне контроллера я должен в $task в конструкции $form = $this->createForm(new TaskType(), $task)
поместить объект сущности со всеми связанными с ней сущностями? Вот такие вопросы и куча связанных с ними
других вопросов.

Помогите разобраться вот с этими моментами?

Заранее благодарю.
  • Вопрос задан
  • 750 просмотров
Пригласить эксперта
Ответы на вопрос 1
@e-hot Автор вопроса
Ситуация (см. код ниже):
Есть сущность Posout (оборудование), есть сущности Postype (тип оборудования) и Brand(бренд).
Сущность Posout (оборудование) имеет ОДНОСТОРОННИЕ ManyToOne связи с Postype (тип оборудования) и Brand(бренд), соответственно через поля:
/**
     * @var integer
     * @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entity\Postype", inversedBy="postype_id")
     * @ORM\JoinColumn(name="postype_id", referencedColumnName="id")
     */
    private $postype;

и
/**
     * @var integer
     * @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entity\Brand", inversedBy="posbrand_id")
     * @ORM\JoinColumn(name="posbrand_id", referencedColumnName="id")
     */
    private $posbrand;

Двусторонняя связь не нужна, т.к. Postype и Brand - это уже готовые перечни значений в соответствующих таблицах БД, которые не будут редактироваться, дополняться или удаляться, будут просто тупо использоваться.

Форма для создания нового оборудования (пока рассматриваю отдельно форму для создания и отдельно форму для редактирования оборудования) работает отлично через конструкции, типа:
...
->add( 'postype', new PostypeType() )
->add( 'posbrand', new BrandType() )
...

- выводятся раскрывающиеся списки типов и брендов каждый в своем поле.

Но у меня задача сделать форму редактирования оборудования (изменение типа и бренда), где в этих самых раскрывающихся списках текущие значения должны быть выделены как selected. В связи с такой постановкой задачи у меня возник общий вопрос:
как обращаться из класса формы (возможно, embedded) к связанным между собой сущностям?

Если опять что-то не понятно в описании, пишите - расшифрую.

Сущность Posout (часть кода ненужными для понимания полями и с геттерами и сеттерами опущена):
<?php
namespace Acme\AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * Posout
 * @ORM\Table(name="posout")
 * @ORM\Entity(repositoryClass="Acme\AppBundle\Repository\PosoutRepository")
 */
class Posout {
    /**
     * @var integer
     * @ORM\Column(name="id", type="bigint", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    ...
    /**
     * @var integer
     * @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entity\Postype", inversedBy="postype_id")
     * @ORM\JoinColumn(name="postype_id", referencedColumnName="id")
     */
    private $postype;
    
    /**
     * @var integer
     * @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entity\Brand", inversedBy="posbrand_id")
     * @ORM\JoinColumn(name="posbrand_id", referencedColumnName="id")
     */
    private $posbrand;

    ...

    /**
     * Get id
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set postype
     * @param integer $postype
     * @return Posout
     */
    public function setPostype( $postype )
    {
        $this->postype = $postype;
        return $this;
    }

    /**
     * Get postype
     * @return integer 
     */
    public function getPostype()
    {
        return $this->postype;
    }

    /**
     * Set posbrand
     * @param integer $posbrand
     * @return Posout
     */
    public function setPosbrand( $posbrand )
    {
        $this->posbrand = $posbrand;
        return $this;
    }

    /**
     * Get posbrand_id
     * @return integer 
     */
    public function getPosbrand()
    {
        return $this->posbrand;
    }

    ...
}


Сущность Postype (часть кода ненужными для понимания полями и с геттерами и сеттерами опущена):
<?php
namespace Acme\AppBundle\Entity;use Doctrine\ORM\Mapping as ORM;

/**
 * Postype
 * @ORM\Table(name="postype")
 * @ORM\Entity
 */
class Postype {
    /**
     * @var integer
     * @ORM\Column(name="id", type="bigint")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var integer
     * @ORM\Column(name="postype_id", type="integer")
     */
    private $postype_id;

    
    /**
     * @var string
     * @ORM\Column(name="postype_desc", type="string")
     */
    private $postype_desc;
    
    /**
     * @var string
     * @ORM\Column(name="postype_name", type="string")
     */
    private $postype_name;
    
    /**
     * Get id
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set postype_id
     * @param integer $postypeId
     * @return Postype
     */
    public function setPostypeId($postypeId)
    {
        $this->postype_id = $postypeId;
        return $this;
    }

    /**
     * Get postype_id
     * @return integer 
     */
    public function getPostypeId()
    {
        return $this->postype_id;
    }
    ...
}


И сущность Brand (часть кода ненужными для понимания полями и с геттерами и сеттерами опущена):
<?phpnamespace Acme\AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * Brand
 * @ORM\Table(name="brand")
 * @ORM\Entity
 */
class Brand {
    /**
     * @var integer
     * @ORM\Column(name="id", type="bigint")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var integer
     * @ORM\Column(name="posbrand_id", type="bigint")
     */
    private $posbrand_id;
    
    /**
     * @var string
     * @ORM\Column(name="posbrand_name", type="string")
     */
    private $posbrand_name;

    /**
     * Get id
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set posbrand_id
     * @param integer $posbrandId
     * @return Brand
     */
    public function setPosbrandId($posbrandId)
    {
        $this->posbrand_id = $posbrandId;
        return $this;
    }

    /**
     * Get posbrand_id
     * @return integer 
     */
    public function getPosbrandId()
    {
        return $this->posbrand_id;
    }
    ...
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы