【问题标题】:Symfony 5: Argument #1 ($Genre) must be of type ?App\Entity\MusicGenre, string given , called in PartiturasFixtures.phpSymfony 5:参数 #1 ($Genre) 必须是 ?App\Entity\MusicGenre 类型,给定字符串,在 PartiturasFixtures.php 中调用
【发布时间】:2021-03-06 07:29:42
【问题描述】:

我已经在 Symfony 5 中安装了 orm-fixtures,它对我的​​实体非常有效。但是一个实体(Partituras = 乐谱)与 MusicGenre 实体(@ORM\ManyToOne(targetEntity="App\Entity\MusicGenre", inversedBy="musicscore")有关系。

所以当我尝试运行以下命令时:./bin/console doctrine:fixtures:load

终端返回以下错误:

App\Entity\MusicGenre::setGenre(): 参数 #1 ($Genre) 必须是 ?App\Entity\MusicGenre 类型,给定字符串,在 /Users/webdevelopment/Sites/creativeStage/src/DataFixtures/ 中调用PartiturasFixtures.php 第 36 行

我的 PartiturasFixtures.php 文件中的代码如下所示:

<?php

namespace App\DataFixtures;

use App\Entity\Partituras;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;

class PartiturasFixtures extends Fixture
{

    public function load(ObjectManager $manager)
    {

        // DEFINE AN ARRAY AND INSERT INTO THE DATABASE ALL MUSIC SCORES
        $partituras = array(
            array('id' => '1',
                'genre_id' => '10',
                'cancion' => 'Nova Flor',
                'compositor' => 'Mario Zán e Palmeira',
                'tonalidad' => 'MI mayor | FA mayor',
                'disponibilidad_guitarra' => 'disponible',
                'disponibilidad_arpa' => 'disponible',
                'country_code' => 'BR')
        );

        // END ARRAY

        // CREATE A FOREACH LOOP
        foreach ($partituras as $element):

            $partituraNew = new Partituras();
            $genre_id = $element['genre_id'];
            $cancion = $element['cancion'];
            $compositor = $element['compositor'];
            $tonalidad = $element['tonalidad'];
            $disponibilidad_guitarra = $element['disponibilidad_guitarra'];
            $disponibilidad_arpa = $element['disponibilidad_arpa'];
            $country_code = $element['country_code'];

            $partituraNew->setCancion($cancion)
                ->setGenre($genre_id)
                ->setCompositor($compositor)
                ->setTonalidad($tonalidad)
                ->setDisponibilidadGuitarra($disponibilidad_guitarra)
                ->setDisponibilidadArpa($disponibilidad_arpa)
                ->setCountryCode($country_code)

            // PREPARE DATA FOR THE DATABASE
            $manager->persist($partituraNew);

        endforeach;

        // INSERT DATA INTO THE DATABASE
        $manager->flush();

在“Partituras”实体中,setGenre 方法如下所示:

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\MusicGenre", inversedBy="musicscore")
 */
private $Genre;

public function setGenre(?MusicGenre $Genre): self
{
    $this->Genre = $Genre;

    return $this;
}

我知道我必须将 object 从 Fixtures 传递给实体,而不是传递 string,您知道如何解决它吗? p>

【问题讨论】:

  • ->setGenre(new App\Entity\MusicGenre()); ?
  • 您尝试过什么来解决问题?如果您的 setGenre 方法需要一个对象或 null,则不能传递整数
  • 是的,没错,我决定重写我的 PartiturasFixtures 代码并传递一个对象。

标签: string symfony object fixtures


【解决方案1】:

使用 ORM,您必须考虑对象,而不是 id。

MusicGenrePartituras 这里有两个类,它们代表对象,即域模型中的参与者。 ID 只是引用它们的一种方式。

在这种情况下,您必须创建一个新的MusicGenre 对象,该对象与多个Partituras 相关,因此您需要一个MusicGenreFixture 类来创建和保留一些MusicGenre 对象。

您可以在文档 (https://github.com/doctrine/data-fixtures#sharing-objects-between-fixtures) 中找到您需要的所有信息。 如您所见,您可以在夹具之间共享对象并设置夹具依赖项以按顺序加载它们。

【讨论】:

    【解决方案2】:

    我决定为我的 PartiturtasFixtures 重新编写代码,现在它可以正常工作了:??

    <?php
    
    namespace App\DataFixtures;
    
    use App\Entity\MusicGenre;
    use App\Entity\Partituras;
    use Doctrine\Bundle\FixturesBundle\Fixture;
    use Doctrine\Persistence\ObjectManager;
    
    class PartiturasFixtures extends Fixture
    {
    
        private static function getPartiturasData()
        {
            // DEFINE AN ARRAY TO INSERT INTO THE DATABASE ALL MUSIC TITLES
            yield [
                'id' => '1',
                'musicGenre' => 'Polca paraguaya',
                'cancion' => 'A Juliana',
                'compositor' => 'Diosnel Chase y Dario Gómez Serrato',
                'tonalidad' => 'La menor | Re menor',
                'disponibilidad_guitarra' => 'disponible',
                'disponibilidad_arpa' => 'disponible',
                'country_code' => 'PY'
            ];
    
    
        }
    
        public function load(ObjectManager $manager)
        {
    
            // DEFINE THE MUSIC GENRE TYPE
            $musicGenre1 = new MusicGenre();
            $musicGenre1->setName('Baião');
            $musicGenre2 = new MusicGenre();
            $musicGenre2->setName('Carnavalito');
            $musicGenre3 = new MusicGenre();
            $musicGenre3->setName('Chamamé');
            $musicGenre4 = new MusicGenre();
            $musicGenre4->setName('Cumbia');
            $musicGenre5 = new MusicGenre();
            $musicGenre5->setName('Danzante');
            $musicGenre6 = new MusicGenre();
            $musicGenre6->setName('Guarania');
            $musicGenre7 = new MusicGenre();
            $musicGenre7->setName('Joropo');
            $musicGenre8 = new MusicGenre();
            $musicGenre8->setName('Pasacalle');
            $musicGenre9 = new MusicGenre();
            $musicGenre9->setName('Polca correntina');
            $musicGenre10 = new MusicGenre();
            $musicGenre10->setName('Polca paraguaya');
            $musicGenre11 = new MusicGenre();
            $musicGenre11->setName('Rasqueado');
            $musicGenre12 = new MusicGenre();
            $musicGenre12->setName('Rasguido doble');
            $musicGenre13 = new MusicGenre();
            $musicGenre13->setName('San juanito');
            $musicGenre14 = new MusicGenre();
            $musicGenre14->setName('Zamba argentina');
    
            // PREPARE MUSIC GENRE DATA FOR DATABASE
            $manager->persist($musicGenre1);
            $manager->persist($musicGenre2);
            $manager->persist($musicGenre3);
            $manager->persist($musicGenre4);
            $manager->persist($musicGenre5);
            $manager->persist($musicGenre6);
            $manager->persist($musicGenre7);
            $manager->persist($musicGenre8);
            $manager->persist($musicGenre9);
            $manager->persist($musicGenre10);
            $manager->persist($musicGenre11);
            $manager->persist($musicGenre12);
            $manager->persist($musicGenre13);
            $manager->persist($musicGenre14);
    
            // DEFINE ONE MUSIC-GENRE DATA ARRAY ...
            $musicGenres = [
                'Baião' => $musicGenre1,
                'Carnavalito' => $musicGenre2,
                'Chamamé' => $musicGenre3,
                'Cumbia' => $musicGenre4,
                'Danzante' => $musicGenre5,
                'Guarania' => $musicGenre6,
                'Joropo' => $musicGenre7,
                'Pasacalle' => $musicGenre8,
                'Polca correntina' => $musicGenre9,
                'Polca paraguaya' => $musicGenre10,
                'Rasqueado' => $musicGenre11,
                'Rasguido doble' => $musicGenre12,
                'San Juanito' => $musicGenre13,
                'Zamba argentina' => $musicGenre14
            ];
    
            // END ARRAY
    
            // CREATE A FOREACH LOOP
            foreach (self::getPartiturasData() as $partiturasData):
    
                $musicScores = new Partituras();
                $musicScores->setCancion($partiturasData['cancion'])
                    ->setGenre($musicGenres[$partiturasData['musicGenre']])
                    ->setCompositor($partiturasData['compositor'])
                    ->setTonalidad($partiturasData['tonalidad'])
                    ->setDisponibilidadGuitarra($partiturasData['disponibilidad_guitarra'])
                    ->setDisponibilidadArpa($partiturasData['disponibilidad_arpa'])
                    ->setCountryCode($partiturasData['country_code'])
                    ->setGuitarUrl($partiturasData['guitar_url'])
                    ->setHarpUrl($partiturasData['harp_url']);
    
                // PREPARE DATA FOR THE DATABASE
                $manager->persist($musicScores);
    
            endforeach;
    
            // INSERT DATA INTO THE DATABASE USING THE FLUSH METHOD
            $manager->flush();
    
        }
    }
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-30
      • 2023-02-14
      • 2022-08-21
      • 2021-10-18
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多