Symfony2 + Doctrine2 - 从额外字段保存数据并作为数组插入数据库

时间:2015-08-29 04:05:11

标签: arrays symfony twig

我有一个表单,用于将数据添加到budget表中。它的形式在其中的一部分中包含来自另一个名为material的表的数据列表,该表仅列出数据库中每种材料的名称。每个项目旁边都有两个input字段,一个用于数量,一个用于价格,属于budget表。贝娄是我在我看来写的代码:

{% for material in materials %}
    <div class="col-lg-2">
        {{ material.name }}
    </div>
    <div class="col-lg-10">
        <input type="hidden" class="material-price" value="{{ material.price }}"/>
        <input class="n-materials" type="number" size="15" name="cdg_budget_type[quantity]" value="0"/>
        - R$
        <input class="final-price" type="number" size="5" name="cdg_budget_type[price]" value="0" disabled/>
    </div>
{% endfor %}

hidden字段仅用于通过JavaScript将价格数量相乘,并在price字段中将其打印出来。这就是我找到的解决方案。

来自budget的字段材料是作为数组类型创建的,所以我需要知道如何将其保存到表中,例如:

"Material A" = [
    ["quantity" => 12],
    ["price" => 124]
],
...

2 个答案:

答案 0 :(得分:2)

一旦您需要将整个数组存储到数据库字段中,您就可以确定数据库模型是错误的。您需要的是一个新的实体和一个新的数据库表。如何调用此表是您自己的选择,但我们可以说您将其称为“必需品”。现在,您的预算表将与您的新表格必需品具有OneToMany关系。

您可以通过两种方式设置“必需品”表:

-id -material_id

在这种情况下,如果您更新材料价格,预算价格将会发生变化。

OR

-id -数量 正价

在这种情况下,您的预算计算不会改变

拿一杯咖啡,一张纸和一支铅笔,给自己时间考虑数据模型。

答案 1 :(得分:0)

让Doctrine帮助你。向您的实体添加One-to-Many。 有关所有类型的关系,请参阅docs。 别忘了运行 app / console doctrine:generate:entities 命令来自动生成方法。

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Budget
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Budget
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="string", length=64)
     */
    private $description;

    /**
     * @ORM\OneToMany(targetEntity="Necessity", mappedBy="budget")
     **/
    private $necessities;

    public function __construct() {
        $this->necessities = new ArrayCollection();
    }

}

和必要实体:

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Necessity
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Necessity
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="string", length=64)
     */
    private $description;

    /**
     * @var float
     *
     * @ORM\Column(name="price", type="float")
     */
    private $price;

    /**
     * @ManyToOne(targetEntity="Budget", inversedBy="necessities")
     * @JoinColumn(name="budget_id", referencedColumnName="id")
     **/
    private $budget;

}