Symfony / Doctrine不保存实体(称'列'内容'不能为空。)

时间:2017-11-28 14:02:59

标签: php mysql forms symfony doctrine

我目前正在制定一个规划不同目的地之间的运输的项目。因此我使用的是Symfony 3.3。

我创建了一个在我的开发环境中完美运行但在我的生产平台上崩溃的表单。

表单由主Form(transportFormType.php)和包含的子表单(truckFormType.php)组成,您可以看到它们附加。 表单已在TwigFile(_form.html.twig)中正确添加。

在我的开发环境中,填写表单后我可以保存它并将其保存到数据库中。在我的生产服务器上部署项目后,我也可以看到常规表单并用内容填充它,但点击“保存”后没有任何反应,我的prod-logs说明缺少列。

有人知道我的错吗?

谢谢!

日志消息:

  

request.CRITICAL:SQLSTATE [23000]:完整性约束违规:1048列'内容'不能为空“在/ ...第112行{”异常“:”[object](Doctrine \ DBAL \ Exception \ NotNullConstraintViolationException(代码:0):在执行“INSERT INTO卡车(trucktype,载体,预订,内容,loading_time,license_plate,DRIVER_NAME,签入,结账,delivery_time,shift_start,steeringtime,netto_steering_time_in_seconds,gros_drive_time_in_seconds_with_driver,check_out_information,优先级,transport_id,booker_id发生异常,check_in_by_id,check_out_by_id,loading_place_id)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? )'with params [\“7,5t Koffer \”,null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,1,null,null, null,1]:\ n \ n \ nSQLSTATE [23000]:完整性约束违规:1048列'内容'不能为/ www / htdocs / w01759ff / www / disponentMe / vendor / doctrine / dbal / lib / Doctrine / DBAL / Driver / AbstractMySQL Driver.php:112,Doctrine \ DBAL \ Driver \ PDOException(代码:23000):SQLSTATE [23000]:完整性约束违规:1048列'内容'不能为/..//lib/Doctrine/DBAL/Driver/ PDOStatement.php:107,PDOException(代码:23000):SQLSTATE [23000]:完整性约束违规:1048列'内容'不能为/www/.../lib/Doctrine/DBAL/Driver/PDOStatement.php为空: 105)“} []

TransportFomType.php:

$builder
    ->add('origin', EntityType::class, [
        'class' => 'AppBundle\Entity\Address',
        'choice_label' => 'station',
        'query_builder' => function (EntityRepository $er) {
            return $er->createQueryBuilder('a')
                ->where('a.isStation = true');
        },
        'attr' => [
            'onchange' => "filterLoadingPlaces()"
        ],
    ])
    ->add('destination', AddressFormType::class)
    ->add('trucks', CollectionType::class, [
        'entry_type' => TruckFormType::class,
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false,
    ]);

TruckFormType.php:

$builder
    ->add('content')
    ->add('loadingPlace', EntityType::class, [
        'class' => 'AppBundle\Entity\LoadingPlace',
        'choice_label' => 'name',
        'choice_attr' => function(LoadingPlace $place, $key, $index) {
            return ['station' => $place->getAddress()->getId()];
        },
        'attr' => [
            'class' => "loadingPlace",
        ]
    ])
    ->add('trucktype', ChoiceType::class, [
        'choices' => [
            '7,5t Koffer' => '7,5t Koffer',
            'Sattel mit Plane' => 'Sattel mit Plane',
            'Sattel mit Koffer' => 'Sattel mit Koffer',
            'Sattel mit Plattform' => 'Sattel mit Plattform',
        ]
    ])
    ->add('deliveryTime', DateTimeType::class, [
        'widget' => 'single_text',
        'html5' => false,
        'attr' => ['class' => 'js-datepicker'],
        'format' => 'dd.MM.yyyy hh:mm',
    ])
;

_form.html.twig:

{% import _self as formMacros %}

{% macro printTruckRow(truckFormType) %}
    <div class="js-truck-item row" style="padding-bottom: 10px;">
        <div>{{ form_widget(truckFormType.content) }}</div>
        <div>{{ form_widget(truckFormType.loadingPlace) }}</div>
        <div>{{ form_widget(truckFormType.trucktype) }}</div>
        <div>{{ form_widget(truckFormType.deliveryTime) }}</div>
        <div class="removeTruck"><a class="js-remove-truck btn btn-danger pull-right" href="#"><i class="fa fa-close"></i></a></div>
    </div>
{% endmacro %}

{{ form_start(transportForm) }}
    {{ form_errors(transportForm) }}
<div class="container-fluid">
    <div class="row">
        <div>
            {{ form_row(transportForm.origin) }}
        </div>
        <div>
            {{ form_row(transportForm.destination.station) }}
        </div>
        <div>
            {{ form_row(transportForm.destination.street) }}
        </div>
        <div>
            {{ form_row(transportForm.destination.postalnumber) }}
        </div>
        <div>
            {{ form_row(transportForm.destination.city) }}
        </div>
        <div>
            {{ form_row(transportForm.destination.country) }}
        </div>
    </div>
    <div class="js-trucks-wrapper" data-prototype="{{ formMacros.printTruckRow(transportForm.trucks.vars.prototype)|e('html_attr') }}" data-index="{{ transportForm.trucks|length }}">
        <div>Content</div>
        <div>Loadingdock</div>
        <div>Trucktype</div>
        <div>DeliveryTime</div>
        <div></div>
        {% for truck in transportForm.trucks %}
            {{ formMacros.printTruckRow(truck) }}
        {% endfor %}
        <a href="#" class="btn btn-success js-add-truck" style="margin-top: 10px"><i class="fa fa-plus"></i> {{ 'transport.button.addTruck'|trans() }}</a>
    </div>
    <button type="submit" class="btn btn-primary" formnovalidate>{{ 'transport.button.save'|trans() }}</button>
    {{ form_end(transportForm) }}
</div>

控制器功能:

public function  newAction(Request $request) {

    $transport = new Transport();
    $truck = new Truck();
    $transport->addTruck($truck);
    $transport->setOrderer($this->get('security.token_storage')->getToken()->getUser());
    $transport->setIsReturn(false);

    $form = $this->createForm(TransportFormType::class, $transport);

    $form->handleRequest($request);

    if($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($form->getData());
        $em->flush();

        $this->addFlash('success','Transport created.');
        return $this->redirectToRoute('open_transport_list');
    }

    return $this->render(':transport:newTransport.html.twig', ['transportForm' => $form->createView()]);
}

卡车的实体类(没有吸气剂和安装者):

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\TruckRepository")
 * @ORM\Table(name="truck")
 */
class Truck
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Transport", inversedBy="trucks")
     * @ORM\JoinColumn()
     */
    private $transport;

    /**
     * @ORM\ManyToOne(targetEntity="User")
     */
    private $booker;

    /**
     * @ORM\ManyToOne(targetEntity="User")
     */

    private $checkInBy;
    /**
     * @ORM\ManyToOne(targetEntity="User")
     */
    private $checkOutBy;

    /**
     * @ORM\Column(type="string")
     */
    private $trucktype;

    /**
     * @ORM\Column(type="string",nullable=true)
     */
    private $carrier;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $booked;

    /**
     * @ORM\Column(type="string", nullable=true)
     */
    private $content;

    /**
     * @ORM\ManyToOne(targetEntity="LoadingPlace")
     */
    private $loadingPlace;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $loadingTime;

    /**
     * @ORM\Column(type="string", nullable=true)
     */
    private $licensePlate;

    /**
     * @ORM\Column(type="string", nullable=true)
     */
    private $driverName;

    /**
     * @ORM\Column(type="datetime",nullable=true)
     */
    private $checkin;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $checkout;

    /**
     * TODO Sicherstellen, dass Datum neuer als NOW() ist.
     * @ORM\Column(type="datetime")
     */
    private $deliveryTime;

    /**
     * TODO Sicherstellen, dass Datum älter als NOW() ist.
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $shiftStart;

    /**
     * Lenkzeit in Minuten
     * @ORM\Column(type="integer", nullable=true)
     * @Assert\Range(min=0, minMessage="Negative Lenkzeiten gibt es nicht.")
     * @Assert\Range(max=36000, maxMessage="Mehr als 10 Stunden Lenkzeiten sind nicht erlaubt." )
     */
    private $steeringtime;


    /**
     * @ORM\Column(type="integer",nullable=true)
     */
    private $nettoSteeringTimeInSeconds;

    /**
     * @ORM\Column(type="integer", nullable=true)
     */
    private $grosDriveTimeInSecondsWithDriver;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $checkOutInformation;

    /**
     * @ORM\Column(type="integer")
     */
    private $priority = 0;

2 个答案:

答案 0 :(得分:0)

$em->persist($form->getData());

我认为应该是

$em->persist($transport);

答案 1 :(得分:0)

感谢您的贡献。在没有任何改变的情况下,持久性现在也适用于生产机器。我认为这必须是任何类型的缓存,但说实话,我不知道为什么这是可能的:

我已经从我的git-repository中全新设置了生产环境,并创建了所有新的数据库和模式结构。

所以这个问题从我这边关闭了。