3

フィクスチャを作成していますが、それらをロードしようとするとエラーが発生します。私は Movie オブジェクトのインスタンスを必要としていますが、私が与えるものは、理由はわかりませんが、整数です。このため、次のエラーがあると表示されます。

 [Symfony\Component\Debug\Exception\ContextErrorException]
 Catchable Fatal Error: Argument 1 passed to Filmboot\MovieBundle\Document\A
 ward::setMovie() must be an instance of Filmboot\MovieBundle\Document\Movie
 , integer given, called in C:\Programming\xampp\htdocs\filmboot.web\src\Fil
 mboot\MovieBundle\DataFixtures\MongoDB\Awards.php on line 143 and defined i
 n C:\Programming\xampp\htdocs\filmboot.web\src\Filmboot\MovieBundle\Documen
 t\Award.php line 107

これは私の Fixture クラスです:

namespace Filmboot\MovieBundle\DataFixtures\MongoDB;

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

use Filmboot\MovieBundle\Document\Award;

class Awards extends AbstractFixture implements OrderedFixtureInterface {
    public function load(ObjectManager $manager) {
        $awards = array(
            array(
                "name"     => "Sitges",
                "year"     => "1992",
                "category" => "Best director"
        );

        foreach ($awards as $award) {
            $document = new Award();
            $document->setName    ($award["name"]);
            $document->setYear    ($award["year"]);
            $document->setCategory($award["category"]);

            $manager->persist($document);
            $this->addReference("award-" .$i, $award);

        }

        $manager->flush();
    }
    public function getOrder() {
        return 1;
    }
}

そして、これはドキュメントクラスです:

namespace Filmboot\MovieBundle\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Doctrine\Common\Collections\ArrayCollection;
use Filmboot\MovieBundle\Util;

/**
 * @ODM\Document(db="filmbootdb", collection="awards")
 * @ODM\Document(repositoryClass="Filmboot\MovieBundle\Document\AwardRepository")
 */
class Award {
    /**
     * @ODM\Id
     */
    private $id;

    /**
     * @ODM\String
     */
    private $name;

    /**
     * @ODM\Int
     */
    private $year;

    /**
     * @ODM\String
     */
    private $category;


    /**
     * @ODM\ReferenceOne(targetDocument="Movie", mappedBy="awards", cascade={"persist"})
     */
    private $movie;



    public function getId()        {
        return $this->id;
    }

    public function setName($name) {
        return $this->name = $name;
    }

    public function getName()      {
        return $this->name;
    }

    public function setYear($year) {
        return $this->year = $year;
    }

    public function getYear()      {
        return $this->year;
    }

    public function setCategory($category) {
        return $this->category = $category;
    }

    public function getCategory()  {
        return $this->category;
    }    

    public function setMovie(\Filmboot\MovieBundle\Document\Movie $movie)   {
        $movie->setAward($this);
        return $this->movie = $movie;
    }

}
4

2 に答える 2

2

ご覧のとおり、movie の整数を明示的に指定します。

$awards = array(
            array(
                // ...
                "movie"    => 1,
            ),
          );

// ...

$document->setMovie   ($award["movie"]);

ムービー オブジェクトの代わりに、ムービー オブジェクトが必要なため、スクリプトがクラッシュします。

public function setMovie(\Filmboot\MovieBundle\Document\Movie $movie)   {
    return $this->movie = $movie;
}

したがって、解決策は、映画のフィクスチャを作成し、それらに参照を与えることです。

// When saving inside Movie fixtures
$manager->persist($movie);
$manager->flush();
$this->addReference('movie-'.$i, $movie); // Give the references as movie-1, movie-2...

次に、最初に getOrder() メソッドでロードします:

public function getOrder()
{
    return 0; // 0, loaded first
}

映画の後に Awards が読み込まれるように制御します。

public function getOrder()
{
    return 1; // loaded after 0...
}

Award フィクスチャで参照によってそのように取得した後、 id (integer) だけでなく、オブジェクト全体をロードします。

$awards = array(
            array(
                // ...
                "movie"    => $this->getReference('movie-1'), // Get the Movie object, not just id
            ),
          );

// ...

$document->setMovie   ($award["movie"]);

参照と順序を使用する場合、フィクスチャ クラスは OrderedFixtureInterface を実装する必要があることに注意してください。

namespace Acme\HelloBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Acme\HelloBundle\Entity\Group;

class LoadGroupData extends AbstractFixture implements OrderedFixtureInterface

俳優、監督などの他のすべてのエンティティでこれを行う必要があります...

フィクスチャ間でオブジェクトを (参照により) 共有するためのドキュメントは、こちらにあります。

編集 :

双方向の作業を行うには、Award setter を適応させます。

public function setMovie(\Filmboot\MovieBundle\Document\Movie $movie)   {
    $movie->setAward($this);
    return $this->movie = $movie;
}

cascade persist を使用して持続性を適応させます。

/**
 * @ODM\ReferenceOne(targetDocument="Movie", mappedBy="awards", cascade={"persist"})
 */
private $movie;
于 2013-11-11T10:32:37.450 に答える
1

あなたが得たエラーメッセージは十分に明確です。この不適切な引数マッピングの問題を修正する方法は次のとおりです。

インスタンスの作成に使用しmovieているawards配列に整数を として設定する代わりに。すでに永続化している特定のエンティティをdocument設定してみませんか。Movie

これを行うには、1 つまたは複数movies(必要に応じて異なります) をロードし、これ/それらのエンティティ (y/ies) を引数として設定して、documentインスタンスを作成する必要があります。

例として、既に永続化された userGroup によって入力されたユーザーのこの例(質問について) を 見てください。ここでも同じアイデアを使用できます。

于 2013-11-11T10:32:41.063 に答える