0

我有三个实体:product,这是关系的media结果。这是每个实体:product_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存在一个名为的列,url我需要让它只id具有product. 任何人都可以帮助我完成这项工作吗?我迷路了

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”的产品表。

这意味着在您的控制器中,您现在可以获取与您的产品相关的任何媒体实体,并且只需使用该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 回答