1

私はこのDBモデルを持っています:

ここに画像の説明を入力

の値を取得する必要があり、product_has_product_detail.contentproduct_detail.label持っているだけproduct.idです。これは私のエンティティです:

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="text")
     */
    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_has_product_detail")
     */
    protected $details;

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

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

    /**
     * @ORM\ManyToOne(targetEntity="ProductBundle\Entity\NBrand")
     * @ORM\JoinColumn(name="brand", referencedColumnName="id")
     * */
    private $brand;

    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;
    }

    public function setBrand($brand) {
        $this->brand = $brand;
    }

    public function getBrand() {
        return $this->brand;
    }

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

    public function getDetails() {
        return $this->details;
    }

}


namespace ProductBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="product_has_product_detail")
 */
class ProductHasProductDetail {

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

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

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

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

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

    public function setDetail(\ProductBundle\Entity\ProductDetail $detail) {
        $this->detail = $detail;
    }

    public function getDetail() {
        return $this->detail;
    }

    public function setContent($content) {
        $this->content = $content;
    }

    public function getContent() {
        return $this->content;
    }

}

何が恋しい?

アップデート

これを Product エンティティに追加しました:

/**
 * @ORM\OneToMany(targetEntity="ProductBundle\Entity\ProductHasProductDetail", mappedBy="detail")
 */
protected $details;

そして、これは私がTwigテンプレートに持っているものです:

 {{ entity.getName }}
 {% for item in entity.getDetails %}
        a {{ item.getDetail.getContent }}
 {% endfor %}

その結果、表示されることはありませんgetDetails(もちろんデータはDBに存在します)

更新2

これは、値をレンダリングしようとするテンプレートを呼び出すコントローラー アクションです。

/**
     * Get product data
     *
     * @Route("/product/show/{product_id}", name="product_show")
     * @Method("GET")
     */
    public function showAction(Request $request, $product_id) {
        $entity = $this->getDoctrine()->getRepository('ProductBundle:Product')->find($product_id);
        $entitySeller = $this->getDoctrine()->getRepository('StockBundle:KStock')->find($product_id);

        return $this->render("ProductBundle:Default:product_detail.html.twig", array('entity' => $entity, 'entitySeller' => $entitySeller));
    }
4

2 に答える 2

1

entity(小枝テンプレートの)内部には何が格納されていますか? コントローラーコードで質問を更新できますか? だから私たちはあなたが通過しているものを見ることができますentity.

ところで、あなたの質問に対する一般的な答えは次のとおりです。エンティティは問題ありません。問題はありませんでした。ただし、テンプレート内の関連テーブルにアクセスする方法は、次のようにする必要があります。

{{ entity }} {# your whole query result, assuming you hit product_has_product table #}
{% for item in entity %}
    {{ item.getProduct }} {# the product entity #}
    {{ item.getProduct.getName }} {# the product name #}
    {{ item.getProduct.getDescription }} {# the product description (etc) #}
    {# --- #}
    {{ item.getDetail }} {# the product detail entity #}
    {{ item.getDetail.getLabel }} {# the product detail label #}
{% endfor %}

編集:

あなたが追加したコントローラーのコードによると、それを機能させるには、そのコードを変更する必要があると確信しています。単一の製品 ( によって提供される$product_id) を要求していると仮定して、いくつかの例を示します。

コントローラーは次のようになります。

 $entity = $this->getDoctrine()->getRepository('ProductBundle:ProductHasProductDetail')->findByProduct($product_id);

小枝のテンプレートは次のようになります。

{{ entity.getContent }} {# the product content #}
{{ entity.getDetail.getLabel }} {# the product detail label #}
{{ entity.getProduct }} {# your product (in case you want to access other values) #}
{{ entity.getProduct.getDescription }} {# e.g. the product description #}
于 2013-08-23T20:41:40.213 に答える
0

これが関連しているかもしれません: http://docs.doctrine-project.org/en/latest/reference/association-mapping.html

多対多の関連付けがあまり一般的でないのはなぜですか? 追加の属性をアソシエーションに関連付けたいことがよくあるため、その場合はアソシエーション クラスを導入します。その結果、直接的な多対多の関連付けはなくなり、3 つの参加クラス間の 1 対多/多対 1 の関連付けに置き換えられます。
{{ product.getName }}
{% for productDetail in product.getProductDetails %}
    {{ productDetail.content }}
    {{ productDetail.getDetail.label }}
 {% endfor %}

すでに ManyToMany をドロップしているように見えるので、それで問題ありません。

于 2013-08-23T23:17:16.807 に答える