首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony/Doctrine不保存实体(“列”内容不能为空)。

问Symfony/Doctrine不保存实体(“列”内容不能为空)。
EN

Stack Overflow用户
提问于 2017-11-28 14:02:58
回答 2查看 1.3K关注 0票数 0

我目前正在做一个项目,计划不同目的地之间的交通。因此,我使用Symfony 3.3。

我创建了一个表单,它在我的开发环境中很好地工作,但是在我的生产平台上崩溃了。

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

在我的开发环境中,在填写表单之后,我可以保存它,并将它保存到数据库中。在我的生产服务器上部署项目之后,我还可以看到常规的表单并填充它的内容,但是在单击“保存”之后什么都没有发生,我的prod日志也提到了缺少的列。

有人知道我的错吗?

谢谢!

日志消息:

request.CRITICAL: SQLSTATE23000:完整性约束违反: 1048列‘内容’不能为空“在/.第112行{“异常”:“对象(Doctrine\DBAL\Exception\NotNullConstraintViolationException(code: 0”:执行“插入卡车类型、承运人、预订、内容、loading_time、license_plate、driver_name、签出、结帐、delivery_time、shift_start、驾驶时间、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)值(?、)‘对于params \"7,5t Koffer\",空,0,1,空,1:n\n\nSQLSTATE23000 23000:完整性约束违反: 1048列'content‘在/www/htdocs/w01759ff/www/disponentMe/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:112,上不能为空原则\DBAL\Driver\PDOException(代码: 23000):/.../lib/Doctrine/DBAL/Driver/PDOStatement.php:107,PDOException(代码: 23000):SQLSTATE23000:完整性约束违反: 1048列'content‘不能为空(代码:23000):SQLSTATE23000:完整性约束违反: 1048列'content’在/www/.../lib/Doctrine/DBAL/Driver/PDOStatement.php:105)"}上不能为空[]

TransportFomType.php:

代码语言:javascript
复制
$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:

代码语言:javascript
复制
$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:

代码语言:javascript
复制
{% 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>

控制器功能:

代码语言:javascript
复制
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()]);
}

和卡车的实体类(没有getter和setter):

代码语言:javascript
复制
/**
 * @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;
EN

回答 2

Stack Overflow用户

发布于 2017-11-29 10:34:35

代码语言:javascript
复制
$em->persist($form->getData());

我觉得应该是

代码语言:javascript
复制
$em->persist($transport);
票数 0
EN

Stack Overflow用户

发布于 2017-11-29 11:50:13

谢谢你的贡献。没有任何改变,从我身边,坚持现在也工作在生产机器。我认为这必须是任何类型的缓存,但老实说,我不知道为什么这是可能的:

我已经从我的git存储库中建立了全新的生产环境,并创建了所有的数据库和模式结构,也是新的。

所以这个问题就从我这边解决了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47533447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档