【问题标题】:Why user_id column is NULL?为什么 user_id 列是 NULL?
【发布时间】:2017-04-20 21:36:38
【问题描述】:

我试图在产品和用户之间建立关系。一个用户有许多产品和许多产品 => 1 个用户。问题是当我将表单添加到表“产品”列 user_id = NULL 时。

这是我在产品实体中的关系:

 /**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="products")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
private $user;

和用户实体:

 /**
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Product", mappedBy="user")
 */
private $products;

为什么列 user_id 总是为空?这是用于持久化产品的代码。

/**
 * @Route("/products/add", name="create_products")
 * @Security("has_role('ROLE_USER') or has_role('ROLE_EDITOR') or has_role('ROLE_ADMIN')")
 * @param Request $request
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function createProductAction(Request $request)
{
    $product = new Product();

    $form = $this->createForm(ProductType::class, $product);

    $form->handleRequest($request);

    if($form->isSubmitted() && $form->isValid()) {

        /** @var UploadedFile $file */
        $file = $product->getImageForm();

            $filename = md5($product->getName());

            $file->move(
                $this->get('kernel')->getRootDir() . '/../web/images/products/',
                $filename
            );


            $product->setImage($filename);

        $em = $this->getDoctrine()->getManager();
        $em->persist($product);
        $em->flush();

        $this->redirectToRoute('products');

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

    return $this->render('products/create.product.html.twig', array(
        'productForm' => $form->createView()
    ));
}

【问题讨论】:

  • 你想如何保存这些?你的表单/控制器是什么样的?
  • 能否请您显示有关如何持久化这两个实体的代码?
  • 这里是创建产品操作pastebin.com/LuxTDLip 实际上,我不确定如何将 user_id 保存到控制器中

标签: php symfony


【解决方案1】:

您尚未在 Product 对象中使用 setter 来在控制器中设置用户。这就是问题所在。

你需要像这样使用setter:

$product->setImage($filename);
$product->setUser( $user );


$em = $this->getDoctrine()->getManager();
$em->persist($product);

以上假设您有一个名为setUser 的setter。您还需要创建用户或确定用户。

【讨论】:

    【解决方案2】:

    您在没有用户的情况下持久化产品。你应该这样做:

    $product = new Product();
    $product->setImage($filename);
    $em = $this->getDoctrine()->getManager();
    
    // here you associate the user
    $user = $em->find('\AppBundle\Entity\User', 3); // user with id 3
    $product->setUser($user);
    
    $em->persist($product);
    $em->flush();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      相关资源
      最近更新 更多