2017-10-11 4 views
0

私は2つのテーブル、1つはGrowerProjection、もう1つはCropです。 1つの作物はそれに関連する多くの栽培者予測を有することができる。このプロジェクトには、既に構築された基盤となるデータベースがあり、データベースにはCROP-001という一意のIDがあり、crop_IDという列に格納されています。 GrowerProjectionテーブルにはcrop_IDフィールドもあり、特定の投影が何を話しているかを見ることができます。PHP/Symfony3/Doctrine関連でNULLが返される

これで、Doctrineを使ってエンティティを生成しましたが、今ではこれらのエンティティを結合しようとしています。 ManyToOneアソシエーションを作成しようとすると、常にnull値が返されます。私の質問は次のとおりです。1.何が間違っているのですか。2.将来どのようにこれらの問題をデバッグしますか?

私はスキーマの検証とコンソールからのスキーマの更新を試みましたが、それは効果がないようです。


/** 
* Growerprojection 
* 
* @ORM\Table(name="growerProjection") 
* @ORM\Entity 
*/ 
class Growerprojection 
{ 
    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Crop") 
    * @ORM\JoinColumn(name="cropId", referencedColumnName="cropId") 
    */ 
    private $crop; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="grower_ID", type="string", length=16, nullable=false) 
    */ 
    private $growerId; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="crop_ID", type="string", length=16, nullable=false) 
    */ 
    private $cropId; 

    public function getReadyToLoadDt() { 
     return $this->prjreadytoloaddt; 
    } 

    public function setReadyToLoadDt($theDate) { 
     $this->prjreadytoloaddt=$theDate; 
    } 

    public function getCrop() { 
     return $this->crop; 
    } 

} 

私は教義としてcrop_IDとcropIdとして参加列、とcropIdを使用していますが、実際のテーブルはcrop_IDを使用することを試してみました:

ここGrowerprojectionのエンティティから関連スニップです。 @IDディレクティブの有無にかかわらず試しました。変化なし。 cropは常にnullです。ここ

は作物エンティティの一部である:


/** 
* Crop 
* 
* @ORM\Table(name="crop") 
* @ORM\Entity 
*/ 
class Crop 
{ 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="commodity_ID", type="string", length=16, nullable=false) 
    */ 
    private $commodityId; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="crop_ID", type="string", length=16) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $cropId; 

    public function getCommodityID() { 
     return $this->commodityId; 
    } 
} 

はその後、ここでコントローラのアクションである:


    public function testAction(Request $request) 
    { 
     $repository = $this->getDoctrine()->getRepository('AppBundle:Growerprojection'); 
     $projections = $repository->findBy(
      array('growerId' => 'GROW-001'), 
      array('prjreadytoloaddt' => 'ASC') 
      ); 
     $myCrop = $projections[0]->getCrop(); 
     \Doctrine\Common\Util\Debug::dump($myCrop); 
     return $this->render('grower/growerTest.html.twig', 
      array('projections' => $projections)); 
    } 

これは、栽培者の突起がcropIdとして作物001を有していることが、生産者の投影を見つけCROP-001のcrop_IDを持つ作物テーブルに作物があります。

行\ Doctrine \ Common \ Util \ Debug :: dump($ myCrop);私は、小枝の中でdump()を実行すると、投影が到着し、データが取り込まれていることもわかりますが、列の作物はnullです。

私はここで間違っていますが、どうすればこの協会を働かせることができますか?これを将来どのようにデバッグすればいいですか?

答えて

0

は何が起こったかです:。

データテーブルは、私は彼らが仕事を得ることができなかったに建てられた外部キー制約を持っていなかったので、私はDoctrineのファイルのカップルの上にコピーされた別のプロジェクトを、開始、および使用しますScorpionの提案から示唆されたフォーム。私はDoctrineにスキーマを作成させた後、関連が働きました。ここからの計画は、データベースに現在あるデータをバックアップし、すべてのdoctrineファイルを編集して関連付けを設定し、外部キーを適切に配置してデータベースを再作成させることです。

0

@ORM\JoinColumnnameフィールドとreferencedColumnNameフィールドの値は、フィールド名ではなくSQLテーブルの実際の列名である必要があります。参考までにDoctrine docsを参照してください。

あなたのコードは、この


/** 
* Growerprojection 
* 
* @ORM\Table(name="growerProjection") 
* @ORM\Entity 
*/ 
class Growerprojection 
{ 
    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Crop") 
    * @ORM\JoinColumn(name="crop_ID", referencedColumnName="crop_ID") 
    */ 
    private $crop; 

    ... 

} 

のようになります。しかし、私はエラーのこれらの種類をデバッグするための簡単な方法を見つけていませんでした。私にとって最善のことは、協会を結成する際には慎重になることです。ここで

+0

こんにちは!私はちょうどそれを試み、結果に変化は見られません。私はSymfonyのデバッグバーに気付きましたが、データベースクエリは1つだけでした。 –

+0

それはあまりにもよく聞こえません。私は3つのアイデアが残っています:1. @ORM\Idも削除しようとしましたか?マッピングと矛盾している可能性があります。 2.マッピングを変更した後、bin/console cache:clear --no-warmupでキャッシュをクリーンアップしましたか? 3.ドキュメントにマッピングされた結果のように、データベースにも外部キーマッピングがありますか? – Scorpio

+0

ここでの問題は、データベース内の外部キーマッピングの欠如かもしれないと思います。しかし、データベースでそれらを作成し、構造をエクスポートしたとき、私は外部キーの制約を参照しません。私がdoctrineにschema:create --dumpsqlと言うとき、ダンプするSQLは、外部キー制約に関しても何も言いません。私は問題を見ると思うが、まだ解決策について混乱している! –

関連する問題