Symfony4 FormType: выберите из записей из другой таблицы при добавлении элемента - PullRequest
0 голосов
/ 01 октября 2019

В моем проекте symfony4 есть таблица / сущность ProductOperatingSystem и таблица / сущность OperatingSystem. OperatingSystem имеет одно поле 'name', которое содержит такие вещи, как 'debian', 'windows' и т. Д. ProductOperatingSystem содержит различные поля плюс одно поле, которое является внешним ключом, связанным с записью операционной системы.

Я сделал предложение дляproductOperatingSystem с symfony и может видеть все записи, показывать или редактировать одну. Проблема заключается в том, когда я пытаюсь создать запись productOperatingSystem. Я получил следующую ошибку:

Return value of App\Entity\ProductOperatingSystem::getOperatingSystem() must be an instance of App\Entity\OperatingSystem, null returned

Я понимаю, что это потому, что он ждет объекта, и ничего не предоставлено, потому что способ, которым создается моя сущность productOperatingSystem:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductOperatingSystemRepository")
 */
class ProductOperatingSystem
{
    /**
     * @var int
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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


    /**
     * @var OperatingSystem
     * 
     * @ORM\ManyToOne(targetEntity="App\Entity\OperatingSystem", inversedBy="productOperatingSystems")
     * @ORM\JoinColumn(nullable=false)
     */
    private $operating_system;

    /**
     * @return int|null
     */
    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return string|null
     */
    public function getVersion(): ?string
    {
        return $this->version;
    }

    /**
     * @param string|null $version
     * @return $this
     */
    public function setVersion(?string $version): self
    {
        $this->version = $version;

        return $this;
    }


    /**
     * @return Operatingsystem
     */
    public function getOperatingSystem(): Operatingsystem
    {
        return $this->operating_system;
    }

    /**
     * @param Operatingsystem $operating_system
     * @return ProductOperatingSystem
     */
    public function setOperatingSystem(Operatingsystem $operating_system): self
    {
        $this->operating_system = $operating_system;

        return $this;
    }

}

Вотmy ProductOperatingSystemType.php:

<?php

namespace App\Form;

use App\Entity\ProductOperatingSystem;
use App\Entity\OperatingSystem;
use App\Repository\OperatingSystemRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;


class ProductOperatingSystemType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('version')
            ->add('is_installed')
            ->add('licence')
        ->add('operating_system');
    ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
    $resolver->setDefaults([
        'data_class' => ProductOperatingSystem::class,
    ]);
    }
}

Я пробовал много вещей, но все еще потерялся. Я хотел бы иметь возможность выбирать из существующих записей операционной системы при создании элемента productOperatingSystem. Что мне для этого нужно сделать?

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Вы должны использовать EntityType в вашем formbuilder для поля 'operating_system' Как:

    $builder
        ->add('version')
        ->add('is_installed')
        ->add('licence')
        ->add('operating_system', EntityType::class, [
           'class' => OperatingSystem::class //your entity class
        ]);
0 голосов
/ 02 октября 2019

В моем вопросе пропущен код ProductOperatingSystemController. Именно там я смог исправить свою проблему (ответ @JessGabriel не сработал).

Вот нерабочий код:

    /**
     * @Route("/new/", name="product_operating_system_new", methods={"GET","POST"})
     */
    public function new(Request $request): Response
    {
        $productOperatingSystem = new ProductOperatingSystem();

    $form = $this->createForm(ProductOperatingSystemType::class, $productOperatingSystem);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($productOperatingSystem);
            $entityManager->flush();

            return $this->redirectToRoute('product_operating_system_index');
        }

        return $this->render('product_operating_system/new.html.twig', [
            'form' => $form->createView(),
            'productId' => $productId
        ]);
    }   

Важнейшим изменением было изменение:

$form = $this->createForm(ProductOperatingSystemType::class, $productOperatingSystem);

с:

    $form = $this->createForm(ProductOperatingSystemType::class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...