子实体中的字段没有在symfony中显示


Fields from child entity don't show in symfony

我提前为一个新手问题道歉。我刚开始学习交响乐,就遇到了障碍。我创建了requestforesestimate实体,它可能在RequestForEstimateDetail实体下有多个关联的记录。现在,我试图创建一个表单,不仅显示字段从第一个实体,但也从第二个。Symfony不会返回任何错误,但是它不会呈现RequestForEstimateDetail实体中的"quantity"字段。我使用了下面的教程来创建这个代码:如何嵌入表单集合

这是我的requestforecast实体的一个例子:

<?php
namespace SourcingBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
/**
 * RequestForEstimate
 *
 * @ORM'Table(name="request_for_estimate")
 * @ORM'Entity(repositoryClass="SourcingBundle'Repository'RequestForEstimateRepository")
 */
class RequestForEstimate
{
    /**
     * @var int
     *
     * @ORM'Column(name="requestId", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var int
     *
     * @ORM'Column(name="status", type="integer")
     */
    private $status;
    /**
     * @var 'DateTime
     *
     * @ORM'Column(name="createTime", type="datetime")
     */
    private $createTime;
    /**
     * @var 'DateTime
     *
     * @ORM'Column(name="updateTime", type="datetime")
     */
    private $updateTime;
    /**
     * @var string
     *
     * @ORM'Column(name="name", type="string", length=255)
     */
    private $name;
    /**
     * @ORM'OneToMany(targetEntity="RequestForEstimateDetail", mappedBy="detail", cascade={"persist", "remove"}, orphanRemoval=true)
     */
    private $details;
    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set status
     *
     * @param integer $status
     *
     * @return RequestForEstimate
     */
    public function setStatus($status)
    {
        $this->status = $status;
        return $this;
    }
    /**
     * Get status
     *
     * @return int
     */
    public function getStatus()
    {
        return $this->status;
    }
    /**
     * Set createTime
     *
     * @param 'DateTime $createTime
     *
     * @return RequestForEstimate
     */
    public function setCreateTime($createTime)
    {
        $this->createTime = $createTime;
        return $this;
    }
    /**
     * Get createTime
     *
     * @return 'DateTime
     */
    public function getCreateTime()
    {
        return $this->createTime;
    }
    /**
     * Set updateTime
     *
     * @param 'DateTime $updateTime
     *
     * @return RequestForEstimate
     */
    public function setUpdateTime($updateTime)
    {
        $this->updateTime = $updateTime;
        return $this;
    }
    /**
     * Get updateTime
     *
     * @return 'DateTime
     */
    public function getUpdateTime()
    {
        return $this->updateTime;
    }
    /**
     * Set name
     *
     * @param string $name
     *
     * @return RequestForEstimate
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }
    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->details = new 'Doctrine'Common'Collections'ArrayCollection();
    }
    /**
     * Add detail
     *
     * @param 'SourcingBundle'Entity'RequestForEstimateDetail $detail
     *
     * @return RequestForEstimate
     */
    public function addDetail('SourcingBundle'Entity'RequestForEstimateDetail $detail)
    {
        $this->details[] = $detail;
        return $this;
    }
    /**
     * Remove detail
     *
     * @param 'SourcingBundle'Entity'RequestForEstimateDetail $detail
     */
    public function removeDetail('SourcingBundle'Entity'RequestForEstimateDetail $detail)
    {
        $this->details->removeElement($detail);
    }
    /**
     * Get details
     *
     * @return 'Doctrine'Common'Collections'Collection
     */
    public function getDetails()
    {
        return $this->details;
    }
}

这是我的RequestForEstimateDetail实体:

<?php
namespace SourcingBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
/**
 * RequestForEstimateDetail
 *
 * @ORM'Table(name="request_for_estimate_detail")
 * @ORM'Entity(repositoryClass="SourcingBundle'Repository'RequestForEstimateDetailRepository")
 */
class RequestForEstimateDetail
{
    /**
     * @var int
     *
     * @ORM'Column(name="requestDetailId", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM'ManyToOne(targetEntity="RequestForEstimate", inversedBy="details")
     * @ORM'JoinColumn(name="requestId", referencedColumnName="requestId")
     */
    private $detail;
    /**
     * @var int
     *
     * @ORM'Column(name="productId", type="integer")
     */
    private $productId;
    /**
     * @var int
     *
     * @ORM'Column(name="quantity", type="integer")
     */
    private $quantity;
    /**
     * @var string
     *
     * @ORM'Column(name="pricePerUnit", type="decimal", precision=2, scale=0)
     */
    private $pricePerUnit;
    /**
     * @var string
     *
     * @ORM'Column(name="shippingCost", type="decimal", precision=2, scale=0)
     */
    private $shippingCost;
    /**
     * @var string
     *
     * @ORM'Column(name="otherFees", type="decimal", precision=2, scale=0)
     */
    private $otherFees;

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set product
     *
     * @param integer $product
     *
     * @return RequestForEstimateDetail
     */
    public function setProduct($product)
    {
        $this->product = $product;
        return $this;
    }
    /**
     * Get product
     *
     * @return int
     */
    public function getProduct()
    {
        return $this->product;
    }
    /**
     * Set quantity
     *
     * @param integer $quantity
     *
     * @return RequestForEstimateDetail
     */
    public function setQuantity($quantity)
    {
        $this->quantity = $quantity;
        return $this;
    }
    /**
     * Get quantity
     *
     * @return int
     */
    public function getQuantity()
    {
        return $this->quantity;
    }
    /**
     * Set pricePerUnit
     *
     * @param string $pricePerUnit
     *
     * @return RequestForEstimateDetail
     */
    public function setPricePerUnit($pricePerUnit)
    {
        $this->pricePerUnit = $pricePerUnit;
        return $this;
    }
    /**
     * Get pricePerUnit
     *
     * @return string
     */
    public function getPricePerUnit()
    {
        return $this->pricePerUnit;
    }
    /**
     * Set shippingCost
     *
     * @param string $shippingCost
     *
     * @return RequestForEstimateDetail
     */
    public function setShippingCost($shippingCost)
    {
        $this->shippingCost = $shippingCost;
        return $this;
    }
    /**
     * Get shippingCost
     *
     * @return string
     */
    public function getShippingCost()
    {
        return $this->shippingCost;
    }
    /**
     * Set otherFees
     *
     * @param string $otherFees
     *
     * @return RequestForEstimateDetail
     */
    public function setOtherFees($otherFees)
    {
        $this->otherFees = $otherFees;
        return $this;
    }
    /**
     * Get otherFees
     *
     * @return string
     */
    public function getOtherFees()
    {
        return $this->otherFees;
    }
    /**
     * Set requestId
     *
     * @param 'SourcingBundle'Entity'RequestForEstimate $requestId
     *
     * @return RequestForEstimateDetail
     */
    public function setRequestId('SourcingBundle'Entity'RequestForEstimate $requestId = null)
    {
        $this->requestId = $requestId;
        return $this;
    }
    /**
     * Get requestId
     *
     * @return 'SourcingBundle'Entity'RequestForEstimate
     */
    public function getRequestId()
    {
        return $this->requestId;
    }
    /**
     * Set productId
     *
     * @param 'SourcingBundle'Entity'Product $productId
     *
     * @return RequestForEstimateDetail
     */
    public function setProductId('SourcingBundle'Entity'Product $productId = null)
    {
        $this->productId = $productId;
        return $this;
    }
    /**
     * Get productId
     *
     * @return 'SourcingBundle'Entity'Product
     */
    public function getProductId()
    {
        return $this->productId;
    }
    /**
     * Set detail
     *
     * @param 'SourcingBundle'Entity'RequestForEstimate $detail
     *
     * @return RequestForEstimateDetail
     */
    public function setDetail('SourcingBundle'Entity'RequestForEstimate $detail = null)
    {
        $this->detail = $detail;
        return $this;
    }
    /**
     * Get detail
     *
     * @return 'SourcingBundle'Entity'RequestForEstimate
     */
    public function getDetail()
    {
        return $this->detail;
    }
}
这是我的requestforestimatcontroller:
<?php
namespace SourcingBundle'Controller;
use SourcingBundle'Entity'RequestForEstimate;
use SourcingBundle'Form'Type'RequestForEstimateType;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Symfony'Component'HttpFoundation'Request;
use Symfony'Component'Form'Extension'Core'Type'TextType;
use Symfony'Component'Form'Extension'Core'Type'DateType;
use Symfony'Component'Form'Extension'Core'Type'CollectionType;
use Symfony'Component'Form'Extension'Core'Type'SubmitType;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Route;
class RequestForEstimateController extends Controller
{
/**
     * @Route("sourcing/request-for-estimate", name="request_for_estimate")
     */
    public function addRequest(Request $request)
    {
        $RequestForEstimate = new RequestForEstimate();
        $form = $this->createForm(RequestForEstimateType::class, $RequestForEstimate);
        return $this->render('sourcing/requestforestimate/create.html.twig', array(
           'form' => $form->createView(),
        ));
    }
}

这些是我的表单类:

RequestForEstimateType.php

<?php
namespace SourcingBundle'Form'Type;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolver;
use Symfony'Component'Form'Extension'Core'Type'TextareaType;
use Symfony'Component'Form'Extension'Core'Type'EmailType;
use Symfony'Component'Form'Extension'Core'Type'DateTimeType;
use Symfony'Component'Form'Extension'Core'Type'CollectionType;
class RequestForEstimateType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
        $builder->add('details', CollectionType::class, array(
            'entry_type' => RequestForEstimateDetailType::class
        ));
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'SourcingBundle'Entity'RequestForEstimate',
        ));
    }
}

RequestForEstimateDetailType.php:

<?php
namespace SourcingBundle'Form'Type;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolver;
class RequestForEstimateDetailType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('quantity',TextType::class);  
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'SourcingBundle'Entity'RequestForEstimateDetail',
        ));
    }
}

现在我的观点:

<div class="row">
    <div class="col-sm-12">
        <div class="ibox float-e-margins">
            <div class="ibox-title">
                <h5>Create Request For Estimate</h5>
            </div>
            <div class="ibox-content">
                {{ form_start(form) }}
                    {{ form_errors(form) }}
                    <div>
                        {{ form_widget(form) }}
                    </div>
                    {{ dump(form.details)}}
                    {% for detail in form.details %}
                        <li>{{ form_row(detail.quantity) }}</li>
                    {% endfor %}
                {{ form_end(form) }}
            </div>
        </div>
    </div>
</div>

您需要在控制器类中创建一些RequestForEstimateDetail实体,并将其添加到RequestForEstimate实体中。这样的:

class RequestForEstimateController extends Controller
{
    /**
     * @Route("sourcing/request-for-estimate", name="request_for_estimate")
     */
    public function addRequest(Request $request)
    {
        $RequestForEstimate = new RequestForEstimate();
        $detail1 = new RequestForEstimateDetail();
        $detail2 = new RequestForEstimateDetail();
        $RequestForEstimate->addDetail($detail1); 
        $RequestForEstimate->addDetail($detail2);            
        $form = $this->createForm(RequestForEstimateType::class, $RequestForEstimate);
        return $this->render('sourcing/requestforestimate/create.html.twig', array(
           'form' => $form->createView(),
        ));
    }
}

p。你可以阅读这个文档http://symfony.com/doc/current/form/form_collections.html这很清楚=)