Проблема Symfony DoctrineFixturesBundle с зависимостями

#symfony #fixtures

#symfony #приспособления

Вопрос:

У меня есть класс приспособлений, который зависит от 2 других классов. Согласно документации, для этого мне нужно реализовать DependentFixtureInterface и добавить метод getDependencies(), возвращающий их. И я это сделал, однако я получаю SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'comunidad_autonoma_id' cannot be null сообщение об ошибке. Я уже несколько раз очищал и прогревал кеш, но ошибка сохраняется. Чего мне не хватает?

Вот мой класс приспособлений…

 <?php

namespace AppDataFixturesAppCommon;

use AppDataFixturesAppAdminUsuarioFixtures;
use AppEntityAppCommonComunidadAutonoma;
use AppEntityAppCommonProvincia;
use DoctrineBundleFixturesBundleFixture;
use DoctrineCommonDataFixturesDependentFixtureInterface;
use DoctrinePersistenceObjectManager;

class ProvinciaFixtures extends Fixture implements DependentFixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $provincias = [
            ['codigo' => '', 'denominacion' => 'Almería', 'descripcion' => '', 'comunidad_autonoma' => 'Andalucía'],
            ['codigo' => '', 'denominacion' => 'Cádiz', 'descripcion' => '', 'comunidad_autonoma' => 'Andalucía'],
            ['codigo' => '', 'denominacion' => 'Córdoba', 'descripcion' => '', 'comunidad_autonoma' => 'Andalucía'],
            ['codigo' => '', 'denominacion' => 'Granada', 'descripcion' => '', 'comunidad_autonoma' => 'Andalucía'],
            ['codigo' => '', 'denominacion' => 'Huelva', 'descripcion' => '', 'comunidad_autonoma' => 'Andalucía'],
            ['codigo' => '', 'denominacion' => 'Jaén', 'descripcion' => '', 'comunidad_autonoma' => 'Andalucía'],
            ['codigo' => '', 'denominacion' => 'Málaga', 'descripcion' => '', 'comunidad_autonoma' => 'Andalucía'],
            ['codigo' => '', 'denominacion' => 'Sevilla', 'descripcion' => '', 'comunidad_autonoma' => 'Andalucía'],
            ['codigo' => '', 'denominacion' => 'Huesca', 'descripcion' => '', 'comunidad_autonoma' => 'Aragón'],
            ['codigo' => '', 'denominacion' => 'Teruel', 'descripcion' => '', 'comunidad_autonoma' => 'Aragón'],
            ['codigo' => '', 'denominacion' => 'Zaragoza', 'descripcion' => '', 'comunidad_autonoma' => 'Aragón'],
            ['codigo' => '', 'denominacion' => 'Las Palmas', 'descripcion' => '', 'comunidad_autonoma' => 'Canarias'],
            ['codigo' => '', 'denominacion' => 'Santa Cruz de Tenerife', 'descripcion' => '', 'comunidad_autonoma' => 'Canarias'],
            ['codigo' => '', 'denominacion' => 'Cantabria', 'descripcion' => '', 'comunidad_autonoma' => 'Cantabria'],
            ['codigo' => '', 'denominacion' => 'Ávila', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla y León'],
            ['codigo' => '', 'denominacion' => 'Burgos', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla y León'],
            ['codigo' => '', 'denominacion' => 'León', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla y León'],
            ['codigo' => '', 'denominacion' => 'Palencia', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla y León'],
            ['codigo' => '', 'denominacion' => 'Salamanca', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla y León'],
            ['codigo' => '', 'denominacion' => 'Segovia', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla y León'],
            ['codigo' => '', 'denominacion' => 'Soria', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla y León'],
            ['codigo' => '', 'denominacion' => 'Valladolid', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla y León'],
            ['codigo' => '', 'denominacion' => 'Zamora', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla y León'],
            ['codigo' => '', 'denominacion' => 'Albacete', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla-La Mancha'],
            ['codigo' => '', 'denominacion' => 'Ciudad Real', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla-La Mancha'],
            ['codigo' => '', 'denominacion' => 'Cuenca', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla-La Mancha'],
            ['codigo' => '', 'denominacion' => 'Guadalajara', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla-La Mancha'],
            ['codigo' => '', 'denominacion' => 'Toledo', 'descripcion' => '', 'comunidad_autonoma' => 'Castilla-La Mancha'],
            ['codigo' => '', 'denominacion' => 'Barcelona', 'descripcion' => '', 'comunidad_autonoma' => 'Cataluña'],
            ['codigo' => '', 'denominacion' => 'Gerona', 'descripcion' => '', 'comunidad_autonoma' => 'Cataluña'],
            ['codigo' => '', 'denominacion' => 'Lérida', 'descripcion' => '', 'comunidad_autonoma' => 'Cataluña'],
            ['codigo' => '', 'denominacion' => 'Tarragona', 'descripcion' => '', 'comunidad_autonoma' => 'Cataluña'],
            ['codigo' => '', 'denominacion' => 'Ceuta', 'descripcion' => '', 'comunidad_autonoma' => 'Ciudades Autónomas'],
            ['codigo' => '', 'denominacion' => 'Melilla', 'descripcion' => '', 'comunidad_autonoma' => 'Ciudades Autónomas'],
            ['codigo' => '', 'denominacion' => 'Madrid', 'descripcion' => '', 'comunidad_autonoma' => 'Comunidad de Madrid'],
            ['codigo' => '', 'denominacion' => 'Navarra', 'descripcion' => '', 'comunidad_autonoma' => 'Comunidad Foral de Navarra'],
            ['codigo' => '', 'denominacion' => 'Alicante', 'descripcion' => '', 'comunidad_autonoma' => 'Comunidad Valenciana'],
            ['codigo' => '', 'denominacion' => 'Castellón', 'descripcion' => '', 'comunidad_autonoma' => 'Comunidad Valenciana'],
            ['codigo' => '', 'denominacion' => 'Valencia', 'descripcion' => '', 'comunidad_autonoma' => 'Comunidad Valenciana'],
            ['codigo' => '', 'denominacion' => 'Badajoz', 'descripcion' => '', 'comunidad_autonoma' => 'Extremadura'],
            ['codigo' => '', 'denominacion' => 'Cáceres', 'descripcion' => '', 'comunidad_autonoma' => 'Extremadura'],
            ['codigo' => '', 'denominacion' => 'La Coruña', 'descripcion' => '', 'comunidad_autonoma' => 'Galicia'],
            ['codigo' => '', 'denominacion' => 'Lugo', 'descripcion' => '', 'comunidad_autonoma' => 'Galicia'],
            ['codigo' => '', 'denominacion' => 'Orense', 'descripcion' => '', 'comunidad_autonoma' => 'Galicia'],
            ['codigo' => '', 'denominacion' => 'Pontevedra', 'descripcion' => '', 'comunidad_autonoma' => 'Galicia'],
            ['codigo' => '', 'denominacion' => 'Baleares', 'descripcion' => '', 'comunidad_autonoma' => 'Islas Baleares'],
            ['codigo' => '', 'denominacion' => 'La Rioja', 'descripcion' => '', 'comunidad_autonoma' => 'La Rioja'],
            ['codigo' => '', 'denominacion' => 'Álava', 'descripcion' => '', 'comunidad_autonoma' => 'País Vasco'],
            ['codigo' => '', 'denominacion' => 'Guipúzcoa', 'descripcion' => '', 'comunidad_autonoma' => 'País Vasco'],
            ['codigo' => '', 'denominacion' => 'Vizcaya', 'descripcion' => '', 'comunidad_autonoma' => 'País Vasco'],
            ['codigo' => '', 'denominacion' => 'Asturias', 'descripcion' => '', 'comunidad_autonoma' => 'Principado de Asturias'],
            ['codigo' => '', 'denominacion' => 'Murcia', 'descripcion' => '', 'comunidad_autonoma' => 'Región de Murcia']
        ];

        foreach ($provincias as $prov) {
            $provincia = new Provincia();
            $provincia->setCreatedBy($this->getReference(UsuarioFixtures::ADMIN_USER_REFERENCE)->getEmail());

            if (!empty($prov['codigo']))
                $provincia->setCodCodigo($prov['codigo']);
            if (!empty($prov['denominacion']))
                $provincia->setCodDenominacion($prov['denominacion']);
            if (!empty($prov['descripcion']))
                $provincia->setCodDescripcion($prov['descripcion']);
            if (!empty($prov['comunidad_autonoma'])) {
                $comunidadAutonoma = $manager
                    ->getRepository(ComunidadAutonoma::class)
                    ->findOneBy(['codDenominacion' => $prov['comunidad_autonoma']]);

                if ($comunidadAutonoma instanceof ComunidadAutonoma)
                    $provincia->setComunidadAutonoma($comunidadAutonoma);
            }

            $manager->persist($provincia);
        }

        $manager->flush();
    }

    public function getDependencies()
    {
        return [
            UsuarioFixtures::class,
            ComunidadAutonomaFixtures::class
        ];
    }
}

 

и вот ошибка, которую я получаю…

введите описание изображения здесь

Ответ №1:

В Doctrine ошибке явно указано, что существует Integrity constraint violation . Столбец comunidad_autonoma_id не может быть нулевым. Либо попробуйте обновить свою сущность Provincia , чтобы пометить поле omunidadAutonoma как обнуляемое, либо проверьте свой массив данных, чтобы убедиться, что у каждого comunidad_autonoma есть соответствующая запись в вашей базе данных.

Комментарии:

1. Вы правы. Позже я понял, что действительно, Symfony загружает приспособления в правильном порядке. Проблема на самом деле в кодировке и всех специальных испанских символах. Теперь я столкнулся с другой проблемой, хахаха… Извините, я должен был закрыть или, по крайней мере, отредактировать этот вопрос. В любом случае спасибо за ваш ответ … 😉

2. Это отвечает на ваш вопрос?

3. Да, это так, вроде как… Извините за поздний ответ. Как я уже сказал, проблема на самом деле связана со специальными символами. Объект ComunidadAutonoma существует, у него есть некоторые данные, и имена в Provincia наборе данных правильные. Просто все эти специальные символы неправильно вставляются в БД, и, следовательно, ни зависимые объекты… Теперь мне нужно найти правильный способ кодирования всех этих символов…

4. Отлично. Если он отвечает на ваш вопрос, вы можете пометить его как правильный ответ, чтобы помочь будущим читателям

Ответ №2:

В for each цикле вы не проверяете, не сработал ли последний if. Вы должны проверить, чтобы persit и остановить его еще.

Вы можете сделать

 if($provincia->getComunidadAutonoma() instanceof ComunidadAutonoma)
    {
        $manager->persist($provincia);
    }