0

私は 3 つのエンティティを持っています:とproductはリレーションの結果です。それぞれのエンティティは次のとおりです。mediaproduct_has_median:m

Product.php

namespace ProductBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product {

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

    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $name;

    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $description;

    /**
     * @ORM\Column(type="smallint")
     */
    protected $age_limit;

    /**
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="created", type="datetime")
     */
    protected $created;

    /**
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(name="modified", type="datetime")
     */
    protected $modified;

    /**
     * @ORM\ManyToMany(targetEntity="CategoryBundle\Entity\Category", inversedBy="products")
     * @ORM\JoinTable(name="product_has_category")
     */
    protected $categories;

    /**
     * @ORM\ManyToMany(targetEntity="ProductBundle\Entity\ProductDetail", inversedBy="products_details")
     * @ORM\JoinTable(name="product_detail_has_product")
     */
    protected $details;

    /**
     * @ORM\OneToMany(targetEntity="StockBundle\Entity\KStock", mappedBy="sku")
     */
    protected $stocks;

    /**
     * @ORM\OneToMany(targetEntity="ProductBundle\Entity\ProductHasMedia", mappedBy="product")
     */
    protected $medias;

    public function __construct() {
        $this->categories = new \Doctrine\Common\Collections\ArrayCollection();
        $this->details = new \Doctrine\Common\Collections\ArrayCollection();
        $this->stocks = new \Doctrine\Common\Collections\ArrayCollection();
        $this->medias = new \Doctrine\Common\Collections\ArrayCollection();
    }

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

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

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

    public function setDescription($description) {
        $this->description = $description;
    }

    public function getCondition() {
        return $this->condition;
    }

    public function setAgeLimit($age_limit) {
        $this->age_limit = $age_limit;
    }

    public function getAgeLimit() {
        return $this->age_limit;
    }

    public function setMedias(\MediaBundle\Entity\Media $medias) {
        $this->medias[] = $medias;
    }

    public function getMedias() {
        return $this->medias;
    }

    public function setCreated($created) {
        $this->created = $created;
    }

    public function getCreated() {
        return $this->created;
    }

    public function setModified($modified) {
        $this->modified = $modified;
    }

    public function getModified() {
        return $this->modified;
    }

}

ProductHasMedia.php

<?php

namespace ProductBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="product_has_media")
 */
class ProductHasMedia {

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="ProductBundle\Entity\Product")
     * @ORM\JoinColumn(name="product", referencedColumnName="id")
     */
    protected $product;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="MediaBundle\Entity\Media")
     * @ORM\JoinColumn(name="media", referencedColumnName="id")
     */
    protected $media;

    public function setProduct(\ProductBundle\Entity\Product $product) {
        $this->product = $product;
    }

    public function getProduct() {
        return $this->product;
    }

    public function setMedia(\MediaBundle\Entity\Media $media) {
        $this->media = $media;
    }

    public function getMedia() {
        return $this->media;
    }
}

media呼ばれる列が存在し、. この仕事を手伝ってくれる人はいますか?道に迷いましたurlidproduct

4

1 に答える 1

2

エンティティにいくつかのマッピングの問題があります。それらが単なる間違いである場合、質問への答えは比較的簡単です。

まず、マッピングの問題

双方向の関係を作成する場合 (メディアが product_has_media を認識し、その逆も同様) を作成する場合は、inversedBy 引数と MappedBy 引数の両方を指定する必要があります。 製品エンティティでマッピングを既に指定しているため、双方向の関係を作成しようとしたと思います。

これに関するドクトリンのドキュメントをここでチェックアウトできます: http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html

現時点では、mappedBy 引数しか指定していないため、壊れたエンティティに関する警告がデバッグ ツールバーに表示されます。これを修正するには、inversedBy 引数を product_has_media エンティティに追加します。

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="ProductBundle\Entity\Product", inversedBy="medias")
 * @ORM\JoinColumn(name="product", referencedColumnName="id")
 */
protected $product;

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="MediaBundle\Entity\Media", inversedBy="products")
 * @ORM\JoinColumn(name="media", referencedColumnName="id")
 */
protected $media;

メディア エンティティに product_has_media のマッピングが既にあることを願っています。そうでない場合は、メディア エンティティのマッピングを投稿してください。回答を更新して支援します。

今可能な解決策

正しいマッピングが得られたので、メディア リポジトリにメソッドを追加して、製品 ID でメディア エンティティを取得できます。

public function fetchByProductId($id)
{
    return $this->createQueryBuilder('m')
        ->leftJoin('m.products','phm')
        ->leftJoin('phm.product','p')
        ->where('p.id = :id')
        ->setParameter('id', $id)
        ->getQuery()
        ->getResult();
}

上記の関数では、inversedBy マッピングで指定されたエイリアス「products」を使用して product_has_media テーブルとエイリアス「product」を使用して product テーブルを結合するクエリを作成しました。

これは、コントローラーで製品に関連するメディア エンティティgetUrl()を取得し、メソッドを使用して URL 値を取得できるようになったことを意味します。

public function someAction($productId)
{
    $medias = $this->getDoctrine()->getRepository('ProductBundle:Media')->fetchByProductId($productId);
    foreach($medias as $media){
        //do something with $media->getUrl();
    }
}

明らかに、私のコードの値をプロジェクトの正しい値に置き換える必要があります。

于 2013-08-20T20:15:31.290 に答える