Учение Symfony Doctrine неожиданное нулевое значение

symfony fixture

521 просмотра

1 ответ

7970 Репутация автора

Я не могу понять, почему этот код отправляет nullзначение вместо фактической ссылки на другую объектную сущность / запись. Это сообщение я получаю в своей консоли во время генерации своих приборов:

Кто-нибудь знает, почему я получаю nullзначение там, а не фактическое значение? Кстати, не тратьте свое время на поиск проблемы в зацикливании данных. Это отлично. Я проверил этот код без массивов данных и зациклился, проблема была точно такой же на одной записи. Это неожиданное нулевое значение.

Доктрина: светильники: нагрузка

[Doctrine \ DBAL \ Exception \ NotNullConstraintViolationException] Возникла исключительная ситуация при выполнении 'INSERT INTO car_model (model, вставка_at, last_edited_at, image, fk_car_mark ) VALUES (?,?,?,?,?)' С параметрами ["A3", " 2016-07-19 10:27:21 "," 2016-07-19 10:27:21 ",
" img ", null ]: SQLSTATE [23000]: Нарушение ограничения целостности: 1048 Столбец 'fk_car_mark' не может быть пустым

Это мой код:

DataFixtures-> ORM-> LoadCarMarkData.php

<?php

namespace AdminBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use AdminBundle\Entity\CarModel;

class LoadCarModelData extends AbstractFixture implements OrderedFixtureInterface
{
    public function load(ObjectManager $manager)
    {
        foreach($this->data as $mark => $modelArray){
            // New Entry ----
            foreach($modelArray as $model){
            $carModel = new CarModel();
            $carModel->setModel($model);
            $carModel->setImage('img');
            $carModel->getFkCarMark($this->getReference($mark));

            $manager->persist($carModel);
            $manager->flush(); 
            }
        }
    }

    public function getOrder()
    {
        // the order in which fixtures will be loaded
        // the lower the number, the sooner that this fixture is loaded
        return 4;
    }

    private $data = [
        'AUDI' => [
            'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8',
            'Q2', 'Q3', 'Q5', 'Q7',
            'TT', 'R8'
        ],
        'SKODA' => [
            'Yeti', 'Roomster', 'Superb', 'Rapid', 'Fabia', 'Mission', 'Joyster', 
        ],
    ];
}

DataFixtures-> ORM-> LoadCarModelData.php

<?php

namespace AdminBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;

use AdminBundle\Entity\CarMark;

class LoadCarMarkData extends AbstractFixture implements OrderedFixtureInterface
{

    public function load(ObjectManager $manager)
    {
        foreach($this->data as $entry){
            $carMark = new CarMark();
            $carMark->setMark(str_replace([' ','/','\\'], ['_'], $entry['mark']));   

            $manager->persist($carMark);
            $manager->flush();

            $this->addReference(str_replace([' ','/','\\'], ['_'], $entry['mark']), $carMark);
        }


    }

    public function getOrder() {
        return 3;
    }

    private $data = [
        ['mark'=>'ACURA'],
        ['mark'=>'ALFA ROMEO'],
        ['mark'=>'AMC'],
        ['mark'=>'ARIEL'],
        ['mark'=>'ASTON MARTIN'],
        ['mark'=>'AUDI'],
        ['mark'=>'AUSTIN HEALEY'],
        ['mark'=>'BENTLEY'],
        ['mark'=>'BMW'],
        ['mark'=>'BUGATTI'],
        ['mark'=>'BUICK'],
        ['mark'=>'CADILLAC'],
        ['mark'=>'CALLAWAY'],
        ['mark'=>'CATERHAM'],
        ['mark'=>'CHEVROLET'],
        ['mark'=>'CHRYSLER'],
        ['mark'=>'CITROEN'],
        ['mark'=>'DAEWOO'],
        ['mark'=>'DAIHATSU'],
        ['mark'=>'DATSUN'],
        ['mark'=>'DE TOMASO'],
        ['mark'=>'DODGE'],
        ['mark'=>'EAGLE'],
        ['mark'=>'FERRARI'],
        ['mark'=>'FIAT'],
        ['mark'=>'FISKER'],
        ['mark'=>'FORD'],
        ['mark'=>'GENESIS'],
        ['mark'=>'GEO'],
        ['mark'=>'GMC'],
        ['mark'=>'HOLDEN'],
        ['mark'=>'HONDA'],
        ['mark'=>'HUMMER'],
        ['mark'=>'HYUNDAI'],
        ['mark'=>'INFINITI'],
        ['mark'=>'ISUZU'],
        ['mark'=>'JAGUAR'],
        ['mark'=>'JEEP'],
        ['mark'=>'KIA'],
        ['mark'=>'KOENIGSEGG'],
        ['mark'=>'LAMBORGHINI'],
        ['mark'=>'LANCIA'],
        ['mark'=>'LAND ROVER'],
        ['mark'=>'LEXUS'],
        ['mark'=>'LINCOLN'],
        ['mark'=>'LOTUS'],
        ['mark'=>'MASERATI'],
        ['mark'=>'MAYBACH'],
        ['mark'=>'MAZDA'],
        ['mark'=>'MCLAREN'],
        ['mark'=>'MERCEDES'],
        ['mark'=>'MERCURY'],
        ['mark'=>'MG'],
        ['mark'=>'MINI'],
        ['mark'=>'MITSUBISHI'],
        ['mark'=>'MORGAN'],
        ['mark'=>'MOSLER / ROSSION'],
        ['mark'=>'NISSAN'],
        ['mark'=>'NOBLE'],
        ['mark'=>'OLDSMOBILE'],
        ['mark'=>'OPEL'],
        ['mark'=>'PAGANI'],
        ['mark'=>'PEUGEOT'],
        ['mark'=>'PLYMOUTH'],
        ['mark'=>'PONTIAC'],
        ['mark'=>'PORSCHE'],
        ['mark'=>'PROTON'],
        ['mark'=>'RAM'],
        ['mark'=>'RENAULT'],
        ['mark'=>'ROLLS-ROYCE'],
        ['mark'=>'SAAB'],
        ['mark'=>'SALEEN'],
        ['mark'=>'SATURN'],
        ['mark'=>'SCION'],
        ['mark'=>'SEAT'],
        ['mark'=>'SHELBY'],
        ['mark'=>'SKODA'],
        ['mark'=>'SMART'],
        ['mark'=>'SSANGYONG'],
        ['mark'=>'SUBARU'],
        ['mark'=>'SUZUKI'],
        ['mark'=>'TESLA'],
        ['mark'=>'TOYOTA'],
        ['mark'=>'TRIUMPH'],
        ['mark'=>'VAUXHALL'],
        ['mark'=>'VW'],
        ['mark'=>'VOLVO'],
        ['mark'=>'WESTFIELD'],
    ];
}

Entity-> CarModel.php

<?php

namespace AdminBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use AdminBundle\Entity\CarMark;

/**
 * CarModel
 *
 * @ORM\Table(name="car_model")
 * @ORM\Entity(repositoryClass="AdminBundle\Repository\CarModelRepository")
 * @ORM\HasLifecycleCallbacks
 */
class CarModel
{
    /**
     * @var string
     *
     * @ORM\Column(name="model", type="string", length=255)
     * @ORM\Id
     * 
     */
    private $model;

    /**
     * @var \DateTime
     * @ORM\Column(name="inserted_at", type="datetime", nullable=true)  
     */
    private $insertedAt;

    /**
     * @var \DateTime
     * @ORM\Column(name="last_edited_at", type="datetime", nullable=true)  
     */
    private $lastEditedAt;    

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

    /**
     * @ORM\ManyToOne(targetEntity="CarMark", inversedBy="mark")
     * @ORM\JoinColumn(name="fk_car_mark", referencedColumnName="mark", nullable=false)
     */
    private $fkCarMark;

    /**
     * Set insertedAt
     *
     * @param \DateTime $insertedAt
     *
     * @return CarMark
     */
    public function setInsertedAt(\DateTime $insertedAt)
    {
        $this->insertedAt = $insertedAt;

        return $this;
    }

    /**
     * Get insertedAt
     *
     * @return \DateTime
     */
    public function getInsertedAt()
    {
        return $this->insertedAt;
    }

    /**
     * Set lastEditedAt
     *
     * @param \DateTime $lastEditedAt
     *
     * @return CarMark
     */
    public function setLastEditedAt(\DateTime $lastEditedAt)
    {
        $this->lastEditedAt = $lastEditedAt;

        return $this;
    }

    /**
     * Get lastEditedAt
     *
     * @return \DateTime
     */
    public function getLastEditedAt()
    {
        return $this->lastEditedAt;
    }

    /**
    *
    * @ORM\PrePersist
    * @ORM\PreUpdate
    */
   public function updatedTimestamps()
   {
       $this->setLastEditedAt(new \DateTime('now'));

       if ($this->getInsertedAt() == null) {
           $this->setInsertedAt(new \DateTime('now'));
       }
   }

    /**
     * Set model
     *
     * @param string $model
     *
     * @return CarModel
     */
    public function setModel($model)
    {
        $this->model = $model;

        return $this;
    }

    /**
     * Get model
     *
     * @return string
     */
    public function getModel()
    {
        return $this->model;
    }

    /**
     * Set image
     *
     * @param string $image
     *
     * @return CarModel
     */
    public function setImage($image)
    {
        $this->image = $image;

        return $this;
    }

    /**
     * Get image
     *
     * @return string
     */
    public function getImage()
    {
        return $this->image;
    }

    /**
     * Set fkCarMark
     *
     * @param \AdminBundle\Entity\CarMark $fkCarMark
     *
     * @return CarModel
     */
    public function setFkCarMark(\AdminBundle\Entity\CarMark $fkCarMark)
    {
        $this->fkCarMark = $fkCarMark;

        return $this;
    }

    /**
     * Get fkCarMark
     *
     * @return \AdminBundle\Entity\CarMark
     */
    public function getFkCarMark()
    {
        return $this->fkCarMark;
    }

    public function __toString() {
        return $this->getModel();
    }
}
Автор: DevWL Источник Размещён: 19.07.2016 08:49

Ответы (1)


1 плюс

29654 Репутация автора

Решение

Вы только звоните геттеру getFkCarMark(), но никогда это не фактический сеттер. Похоже, вам нужно заменить:

$carModel->getFkCarMark($this->getReference($mark));

С участием:

$carModel->setFkCarMark($this->getReference($mark));

Таким образом, он фактически устанавливает марку автомобиля, которую он получил.

Автор: Oldskool Размещён: 19.07.2016 08:59
Вопросы из категории :
32x32