猿问

如何映射产品实体以使其由 Doctrine 管理?

我正在尝试在 PS 1.7.6.1 下构建一个模块。


在设计中,我在产品和预购之间存在多对一关系(许多预购可以与一个产品相关联)。


Preorder 对象是一个 ORM 实体:


//mymodule/src/Entity

class Preorder

{

    /**

     * @var int

     *

     * @ORM\Id

     * @ORM\Column(name="id_preorder", type="integer")

     * @ORM\GeneratedValue(strategy="AUTO")

     */

    private $id;


    /**

     * @var int

     *

     * @ORM\Column(name="id_product", type="integer")

     */

    private $productId;


    /**

     * @var string

     *

     * @ORM\Column(name="email", type="string", length=64)

     */

    private $email;


    setter and getter

}

在控制器中:


//src/mymodule/src/Controller



use Doctrine\DBAL\Types\TextType;

use PrestaShopBundle\Controller\Admin\FrameworkBundleAdminController;

use Doctrine\ORM\EntityManagerInterface;

use MyModule\Entity\Preoder;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;

use Symfony\Component\Form\Extension\Core\Type\EmailType;

use Symfony\Component\HttpFoundation\Request;

use Product;


class PreorderController extends FrameworkBundleAdminController

{

public function createAction(Request $request){


        $preorder = new Preorder();

        $preorderForm = $this->createFormBuilder($preorder)

                ->add('email', EmailType::class)

                ->add('productId', EntityType::class, [

                    'class' => Product::class,

                ])

                ->getForm();


        $bookingForm->handleRequest($request);


// validate and persist

}}

问题是表单构建器无法识别 Product 实体。它抛出一个运行时异常:


“产品”类似乎不是托管的 Doctrine 实体。你忘了映射它吗?


我在核心文件中找不到处理这种情况的示例。非常感谢您提前指导/帮助我解决此问题。


湖上湖
浏览 106回答 1
1回答

qq_笑_17

主要问题是它product_id不是一个实体,所以formbuilder用EntityType::class. 您需要正确定义(如文档中所述)您与对象的 ManyToOne 关系在产品方面:/** * @ORM\Entity(repositoryClass="App\Repository\ProductRepository") */class Product{    // usual stuff    /**     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="product", cascade={"persist"})     */    private $preorders;}在预订方面:/** * @ORM\Entity(repositoryClass="App\Repository\ProductRepository") */class Product{    // usual stuff    /**     * @ORM\OneToMany(targetEntity="App\Entity\Product", mappedBy="preorders")     */    private $product;}在您的 formBuilder 中,product将由entityEntityType::class编辑如果您product是 ORM 未映射的遗留类,那么您可以使用dataTransformer帮助您的 formBuilder 识别遗留实体。namespace App\DataTransformer;class ProductToIdTransformer implements DataTransformerInterface{    public function transform($product)    {        if (null === $product) {            return '';        }        return $product->getId();    }    public function reverseTransform($product_id)    {        if (!$product_id){            return;        }         //your db logic to retrieve the product        if (null === $field){            throw new TransformationFailedException(sprintf("the product '%s' does not exist!", $product_id));        }        return $product;    }}然后在您的表单构建器中,您将使用 aCollectionType代替:$preorderForm = $this->createFormBuilder($preorder)    ->add('email', EmailType::class)    ->add('product', CollectionType::class, [        'class' => Product::class,        //some logic to adapt the different choices to your needs    ]);$preorderForm    ->get('product')    ->addModelTransformer(ProductToIdTransformer::class);$preorderForm = $preorderForm->getForm();
随时随地看视频慕课网APP
我要回答