4

この質問は、私の別の質問に関連しています。Doctrine2は、関連するオブジェクトの最初のインスタンスのみを提供します。

以前の問題を解決するために双方向の関連付けを思いついたのですが、今は別の問題があります。

スキーマ[編集済み]

  XYZ\Bundle\CitiesBundle\Entity\Cities:
  type: entity
  table: cities
  fields:
    id:
      id: true
      type: integer
      unsigned: false
      nullable: false
      generator:
        strategy: IDENTITY
    name:
      type: string
      length: 50
      fixed: false
      nullable: false
    landarea:
      type: decimal
      nullable: false
    density:
      type: integer
      unsigned: false
      nullable: false
    population:
      type: integer
      unsigned: false
      nullable: false
  manyToOne:
    state:
      targetEntity: States
      cascade: {  }
      inversedBy: cities
      joinColumn:
        state_id:
          referencedColumnName: id
  lifecycleCallbacks: {  }

エンティティ:

class Cities
{
    //other vars

    /**
     * @var XYZ\Bundle\CitiesBundle\Entity\States
     */
    private $state;

    //other get/set    

    /**
     * Set state
     *
     * @param XYZ\Bundle\CitiesBundle\Entity\States $state
     */
    public function setState(\XYZ\Bundle\CitiesBundle\Entity\States $state)
    {
        $this->state = $state;
    }

    /**
     * Get state
     *
     * @return XYZ\Bundle\CitiesBundle\Entity\States 
     */
    public function getState()
    {
        return $this->state;
    }
}

class States
{
    //other vars and get/set

    private $cities;

    public function __construct()
    {
        $this->cities = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add cities
     *
     * @param XYZ\Bundle\CitiesBundle\Entity\Cities $cities
     */
    public function addCities(\XYZ\Bundle\CitiesBundle\Entity\Cities $cities)
    {
        $this->cities[] = $cities;
    }

    /**
     * Get cities
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getCities()
    {
        return $this->cities;
    }
}

QueryBuilderの使用法:

    $query = $em->createQueryBuilder()
                ->select('c','s')
                ->from('CitiesBundle:Cities', 'c')
                ->innerJoin('c.state', 's')
                ->orderBy('c.population', 'DESC')
                ->setMaxResults(10)
                ->getQuery();  

エラーは次のとおりです。

[セマンティカルエラー]行0、列58の近くの's ORDER BY c.population':エラー:クラスXYZ \ Bundle \ CitiesBundle \ Entity\Citiesにはstateという名前の関連付けがありません

生成されたDQL:

SELECT c、s FROM CitiesBundle:Cities c INNER JOIN c.state s ORDER BY c.population DESC

恥 :(

誰かが私の問題を解決するのを手伝ってもらえますか?

[編集]

都市スキーマを編集しましたが、エラーは次のとおりです。

注意:未定義のインデックス:/home/marek/devel/sf2/cities/vendor/doctrine/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php行473の名前

4

2 に答える 2

2

Symfony を使用する場合、最初に YAML ファイルのマッピングを調べ、エンティティ アノテーションを無視することに注意してください。YAML マッピング ファイルをロードしている間に、注釈を変更するのに何年も費やしました。

于 2013-10-02T21:12:03.743 に答える
2

確かにjoinColumns:(複数形に注意してください) は関係でのみ使用されMany-To-Manyます。他の関係では、 を使用する必要がありますjoinColumn

Cities XML では、次のように入力してみてください。

joinColumn:
    name: state_id
    referencedColumnName: id

それ以外は、XMLで「ManyToOne」の名前を「manyToOne」に変更してみてください。ただし、ここで問題があるとは思えません...

お役に立てれば...

于 2012-05-05T08:50:28.240 に答える