Бренды столбцов не отображаются в форме редактирования, почему?

У меня есть панель инструментов, разработанная поверх Sonata Admin Bundle, и у меня возникла проблема. Вот так метод configureFormFields(FormMapper $formMapper) выглядит на CompanyAdmin контроллере администратора:

protected function configureFormFields(FormMapper $formMapper)
{
    $image = $this->getSubject();
    $fileFieldOptions = array('required' => false, 'label' => 'Logo');
    if ($image && ($webPath = $image->getLogoUrl())) {
        $fileFieldOptions['help'] = '<img src="'.$webPath.'" class="admin-preview img-rounded img-responsive"/>';
    }

    $em = $this->modelManager->getEntityManager('PDI\PDOneBundle\Entity\Brand');
    $query = $em->createQueryBuilder('b')
        ->select('b')
        ->from('PDOneBundle:Brand', 'b')
        ->where('b.company IS NULL');

    $formMapper
        ->with('Information', array('class' => 'col-md-6'))
        ->add('name')
        ->add('division')
        ->add('inactive')
        ->add(
            'brands',
            'sonata_type_model',
            array(
                'multiple' => true,
                'by_reference' => false,
                'query' => $query,
            )
        )
        ->end()
        ->with('Logo', array('class' => 'col-md-6'))
        ->add('file', 'file', $fileFieldOptions)
        ->end();
}

Проблема здесь в том, что когда я назначаю brands company и пытаюсь отредактировать компанию после того, как поле бренда не заполнено, почему? Что мне здесь не хватает? Могу ли я получить некоторую помощь?

Ниже приведен пример с изображениями. Обратите внимание, что когда я редактирую компанию, я не вижу бренд, но когда я редактирую бренд, я вижу компанию:

Редактирование компании Редактировать бренд

ОБНОВЛЕНИЕ

Как показано в Profiler, это запрос, выполняемый для получения результатов в форме редактирования:

SELECT
    t0. NAME AS name_1,
    t0.generic_name AS generic_name_2,
    t0.logo_url AS logo_url_3,
    t0.description AS description_4,
    t0.isi_required AS isi_required_5,
    t0.isi_text AS isi_text_6,
    t0.isi_pdf_url AS isi_pdf_url_7,
    t0.pi_required AS pi_required_8,
    t0.pi_text AS pi_text_9,
    t0.pi_pdf_url AS pi_pdf_url_10,
    t0.inactive AS inactive_11,
    t0.template_name AS template_name_12,
    t0.id AS id_13,
    t0.createdAt AS createdAt_14,
    t0.updatedAt AS updatedAt_15,
    t0.companies_id AS companies_id_16
FROM
    brands t0
WHERE
    t0.companies_id = 2

И это вывод этого запроса из БД:

+------------+----------------+------------------------------------------------------------+---------------+----------------+------------+---------------+---------------+-----------+---------------+-------------+------------------+-------+---------------------+---------------------+-----------------+
| name_1     | generic_name_2 | logo_url_3                                                 | description_4 | isi_required_5 | isi_text_6 | isi_pdf_url_7 | pi_required_8 | pi_text_9 | pi_pdf_url_10 | inactive_11 | template_name_12 | id_13 | createdAt_14        | updatedAt_15        | companies_id_16 |
+------------+----------------+------------------------------------------------------------+---------------+----------------+------------+---------------+---------------+-----------+---------------+-------------+------------------+-------+---------------------+---------------------+-----------------+
| Brand Test |                | https://someurl.com/no_image_available.png |               |              0 | NULL       | NULL          |             0 | NULL      | NULL          |           0 | NULL             |     2 | 2015-10-22 10:45:14 | 2015-10-26 08:04:53 |               2 |
+------------+----------------+------------------------------------------------------------+---------------+----------------+------------+---------------+---------------+-----------+---------------+-------------+------------------+-------+---------------------+---------------------+-----------------+

Итак, существует связь между текущей компанией (редактируемой записью) и брендами, почему это не отображается в форме редактирования?

ОБНОВЛЕНИЕ: Объекты

Ниже приведены определения сущностей для Company и Brands:

/**
 * @ORM\Entity
 * @ORM\Table(name="companies", options={"collate"="utf8_general_ci"})
 * @ORM\HasLifecycleCallbacks()
 */
class Company
{
    use IdentifierAutogeneratedTrait;
    use TimestampableEntity;
    use UploadTrait;

    /**
     * @var string
     * @ORM\Column(type="string", length=45)
     * @Assert\NotBlank()
     */
    protected $name;

    /**
     * @var string
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $logo_url = 'https://someurl.com/no_image_available.png';

    /**
     * @var string
     * @ORM\Column(type="string", length=45, nullable=true)
     */
    protected $division;

    /**
     * @var bool
     * @ORM\Column(type="boolean")
     */
    protected $inactive = false;

    /**
     * @var Brand
     * @ORM\OneToMany(targetEntity="Brand", mappedBy="company", cascade={"persist"})
     **/
    protected $brands;

    public function __construct()
    {
        $this->brands = new ArrayCollection();
    }

    ...
}

/**
 * @ORM\Entity
 * @ORM\Table(name="brands")
 * @ORM\Entity(repositoryClass="PDI\PDOneBundle\Entity\Repository\BrandRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Brand
{
    use IdentifierAutogeneratedTrait;
    use TimestampableEntity;
    use UploadTrait;

    /**
     * @var string
     * @ORM\Column(type="string", length=45)
     * @Assert\NotBlank()
     */
    protected $name;

    /**
     * @var string
     * @ORM\Column(type="string", length=45)
     * @Assert\NotBlank()
     */
    protected $generic_name;

    /**
     * @var string
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $logo_url = 'https://someurl.com/no_image_available.png';

    /**
     * @var string
     * @ORM\Column(type="text")
     * @Assert\NotBlank()
     */
    protected $description;

    /**
     * @var bool
     * @ORM\Column(type="boolean", nullable=true)
     */
    protected $isi_required;

    /**
     * @var string
     * @ORM\Column(type="text", nullable=true)
     */
    protected $isi_text;

    /**
     * @var string
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $isi_pdf_url;

    /**
     * @var bool
     * @ORM\Column(type="boolean", nullable=true)
     */
    protected $pi_required;

    /**
     * @var string
     * @ORM\Column(type="text", nullable=true)
     */
    protected $pi_text;

    /**
     * @var string
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $pi_pdf_url;

    /**
     * @var bool
     * @ORM\Column(type="boolean")
     */
    protected $inactive = false;

    /**
     * @var string
     * @ORM\Column(type="string", length=45, nullable=true)
     */
    protected $template_name;

    /**
     * @var Company
     * @ORM\ManyToOne(targetEntity="Company", inversedBy="brands")
     * @ORM\JoinColumn(name="companies_id", referencedColumnName="id", nullable=true)
     */
    protected $company;

    /**
     * @ORM\OneToMany(targetEntity="TargetBrand" , mappedBy="brand", cascade={"persist"}, orphanRemoval=true)
     * */
    protected $targetBrand;

    /**
     * @ORM\OneToMany(targetEntity="TerritoryBrand" , mappedBy="brand", cascade={"persist"}, orphanRemoval=true)
     * */
    protected $territoryBrand;

    public function __construct()
    {
        $this->targetBrand = new ArrayCollection();
        $this->territoryBrand = new ArrayCollection();
    }

    ...
}

person ReynierPM    schedule 22.10.2015    source источник
comment
Я предполагаю, что у вас есть бренды без компании в базе данных. Есть ли у запроса результаты, когда вы проверяете запрос на панели веб-отладки?   -  person 11mb    schedule 26.10.2015
comment
@ 11mb Конечно, между компанией и брендами есть связь, см. редактирование в основном посте.   -  person ReynierPM    schedule 26.10.2015
comment
Можете ли вы обновить свой вопрос с отношениями сущностей? Я действительно рассматриваю плохие отношения сущностей. Если вы используете Doctrine, это хорошее руководство krueckeberg.org/notes/d2.html   -  person Cassiano    schedule 26.10.2015
comment
@Cassiano готово, я добавил две сущности   -  person ReynierPM    schedule 26.10.2015


Ответы (1)


Если я правильно понял, каждый раз, когда вы загружаете форму, вы заполняете поле brands своим запросом. Этот запрос выбирает бренды, у которых нет ни одной компании. Поэтому, когда вы пытаетесь отредактировать какую-либо компанию, поле заполняется этим запросом. Вы должны сделать другой запрос при редактировании, вы можете получить объект с помощью $this->getSubject(); и проверить, является ли он новым.

Пример решения:

$obj = $this->getSubject()->getId();
if(empty($obj)) {
   $query = $em->createQueryBuilder('b')
    ->select('b')
    ->from('PDOneBundle:Brand', 'b')
    ->where('b.company IS NULL');
} else {
   $query = $em->createQueryBuilder('b')
    ->select('b')
    ->from('PDOneBundle:Brand', 'b')
    ->where('b.company == :company_id');
   $query->setParameter('company_id', $obj->getCompany());
}
person Cassiano    schedule 26.10.2015
comment
Правильно, при редактировании используется тот же запрос, что и при новой компании, и я думаю, что проблема в этом. К сожалению, я совсем не слежу за вами, не могли бы вы опубликовать пример кода? - person ReynierPM; 26.10.2015
comment
Обновлен, если возможный пример, я не слишком подумал, пожалуйста, проверьте и подумайте некоторое время, я думаю, что дал вам путь - person Cassiano; 26.10.2015