43

親子関係をマッピングするためにそれ自体を参照するエンティティがあるとします

class Food
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Food", inversedBy="foodChildren")
     * @ORM\JoinColumn(name="food_group_id", nullable=true)
     */
    protected $foodGroup;

    /**
     * @ORM\OneToMany(targetEntity="Food", mappedBy="foodGroup", fetch="LAZY", cascade={"remove"})
     */
    protected $foodChildren;

food_group_idデータベースから完全な親オブジェクトを取得せずにエンティティを取得したいユースケースがあります。を使用fetch="LAZY"しても、Doctrine は再びクエリを実行できなくなります。取得時にIDのみを返す方法はあり$food->getFoodGroup()ますか?

4

4 に答える 4

108

あなたの人生を複雑にしないでください、あなたはただすることができます

$food->getFoodGroup()->getId()

これにより、追加のクエリが実行されたり、遅延ロードがトリガーされたりすることはありません。

なんで?あなた$food->foodGroupはそのIDを知っているプロキシオブジェクトだからです。ロードされていないフィールドの getter メソッドを呼び出した場合にのみ、遅延ロードが実行されます。

于 2013-10-02T20:59:15.723 に答える
5

ID フィールドを定義し、それを ORM に関連付けてから、そのフィールドのゲッターを作成できるはずであり、それは機能するはずです。

/**
 * @ORM\ManyToOne(targetEntity="Food", inversedBy="foodChildren")
 * @ORM\JoinColumn(name="foodGroupId", referencedColumnName="id")
 */
protected $foodGroup;

/**
 * @ORM\Column(type="integer")
 */
protected $foodGroupId;

public function getFoodGroupId() {
    return $this->foodGroupId;
}

一貫性を保つために、例のフィールド名を Pascal Case に変更したことに注意してください。また、私は Symfony を初めて使用しますが、ManyToOne 関連付けマッピングは奇妙に思えます。エンティティで nullable を使用している理由がわかりません (これまでに見たことがありません)。あなたは referencedColumnName="id" を持っていませんが、それはデフォルトで "id" になっているからかもしれません (私は明示的にしたいのです)。Doctrine docsを参照してください。

私は非常によく似た問題を抱えていました。これは、そのフィールドを ORM に関連付けていなかったために発生しました。したがって、次のように呼び出すことが可能であることを知っておく必要があります。

$food = $em->getRepository("AcmeFoodBundle:Food")->find($id);
$food->getFoodGroupId();
于 2014-05-13T20:32:47.943 に答える
-1

これがパフォーマンスの問題であり、クエリを制限しようとしているかどうかはわかりませんが、ゲッターで次のようなことをしないのはなぜですか (Doctrine ORM Annotations を使用する Food エンティティであると仮定しています):

class Food
{
    ...
    public function getFoodGroup() {
        $foodGroup = $this->getFoodGroup();

        return $foodGroup->getId();
    }

または、適切な名前を付けることもできますgetFoodGroupId()

于 2013-10-02T15:43:05.843 に答える