为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
湖上湖 2022-06-17 17:03:29
我正在尝试在 PS 1.7.6.1 下构建一个模块。在设计中,我在产品和预购之间存在多对一关系(许多预购可以与一个产品相关联)。Preorder 对象是一个 ORM 实体://mymodule/src/Entityclass 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/Controlleruse 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 实体。你忘了映射它吗?我在核心文件中找不到处理这种情况的示例。非常感谢您提前指导/帮助我解决此问题。
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

主要问题是它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();


查看完整回答
反对 回复 2022-06-17
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号