0

ステップ (OneToMany) と関連付けられているテーブル Article と、Article ManyToOne を含む Steps があります。

次の記事を取得します。

$articles = $this->getDoctrine()
            ->getRepository("IftodiDesignBundle:Article")
            ->findAll();

foreach を使用して、すべての記事と手順を表示したいと思います。

foreach($articles as $article)
    {
        $steps = $this->getDoctrine()
                ->getRepository("IftodiDesignBundle:Steps")
                ->createQueryBuilder('s')
                ->where('s.article = \''.$article.'\'')
                ->getQuery()
                ->execute();

        echo "<b>".$article->getTitle()."</b><br />";
        echo $article->getText()."<br />";
    }

Doctrine で生成されたテーブル Article とメソッド getSteps() を使用してテーブル Steps からデータを取得する方法がわかりません。

私を助けてください。


答えてくれてありがとう。

私が持っている表の記事では:

 /**
 * @ORM\OneToMany(targetEntity="Steps", mappedBy="Steps",cascade={"persist"})
 * @ORM\JoinColumn(name="id", referencedColumnName="id_article")
 */
protected $steps;

表の手順:

/**
 * @ORM\ManyToOne(targetEntity="Article", inversedBy="steps")
 * 
 */
protected $article;

私がする時:

 $articles = $this->getDoctrine()
            ->getRepository("IftodiDesignBundle:Article")
            ->findAll();

私が行った場合:

foreach($articles as $article)
    {
        $steps = $article->getSteps();

エラーが表示されます:

 Notice: Undefined index: Steps in /var/www/design/vendor/doctrine/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 1280

私がそれを行う場合:

    $articles = $this->getDoctrine()
            ->getRepository("IftodiDesignBundle:Article")
            ->findAll();
    foreach($articles as $article)
    {
        //Queries to DB
         $steps = $this->getDoctrine()
            ->getRepository("IftodiDesignBundle:Steps")
            ->findBy(array(
                "article"    => $article->getId()
            ));
         $media = $this->getDoctrine()
                 ->getRepository("IftodiDesignBundle:Media")
                 ->findBy(array(
                     "step" => $steps[0]->getId()
                 ));

必要なデータは取得できますが、DB への問い合わせは以上です。

4

2 に答える 2

1

注釈から削除@ORM\JoinColumn(name="id", referencedColumnName="id_article")- doctrine は適切なデフォルトで関連付けを MySQL にマップします。

削除したら、SQL を再生成します。doctrine:schema:update --force

さらに、手順を取得するために記事をループしている場合は、リポジトリにカスタム メソッドを記述したほうがよいでしょう。そうしないと、Doctrine を呼び出すたび->getSteps()に SQL 呼び出しが行われます (100 個の記事をループすると、最終的に 101 回の呼び出しを行うことになります)。データベース!)

これを回避するには、そのようなメソッドをリポジトリに配置できます

public function all()
{
    $queryBuilder = $this->getEntityManager()->createQueryBuilder();

    $queryBuilder
        ->select('Article', 'Steps')
        ->from('IftodiDesignBundle:Article')
        ->leftJoin('Article.steps', 'Steps')
    ;

    // consider using ->getArrayResult() to use less memory
    return $queryBuilder->getQuery()->getResult(); 
}

ブログ投稿にいくつかのベストプラクティスをまとめました

于 2012-06-29T20:39:26.390 に答える
0

良い、

Article モデルに次の関係があると仮定します。

/** 
* @OneToMany(targetEntity="Step", mappedBy="article")
* @JoinColumn(name="id_article", referencedColumnName="id_article_in_step")
*/
protected $steps;

public function getSteps(){ return $this->steps; }

あなたはできるようになるでしょう$article->getSteps();

于 2012-06-29T14:29:43.350 に答える