【问题标题】:Symfony 2, get entity from Many To Many associationSymfony 2,从多对多关联中获取实体
【发布时间】:2015-07-19 08:11:00
【问题描述】:

我有实体ProductTires。 一个产品有更多的轮胎,一个轮胎可以在更多的产品上。

当我调用时在我的控制器中

$product = $em->getRepository('MyBundle:Product')->find($id);

$tires = $product->getExtraTires();

相关轮胎不会返回。

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

class Product {

    public function __construct()
    {
        $this->extraTires = new ArrayCollection();
    }

   /**
     * @ORM\ManyToMany(targetEntity="Tires", mappedBy="products")
     * @ORM\JoinTable(name="product_tires",
     *       joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")},
     *       inverseJoinColumns={@ORM\JoinColumn(name="tires_id", referencedColumnName="id")})
     */
    private $extraTires;

   /**
     * Get extraTires
     *
     * @return ArrayCollection
     */
     public function getExtraTires()
     {
         return $this->extraTires;
     }

    /**
      * Add extraTires
      *
      * @param Tires $extraTires
      * @return Product
      */

      public function addExtraTire(Tires $extraTires)
      {
          $this->extraTires[] = $extraTires;

          return $this;
      }

     /**
      * Remove extraTires
      *
      * @param \Wielton\WieltonBundle\Entity\Tires $extraTires
      */
      public function removeExtraTire(Tires $extraTires)
      {
          $this->extraTires->removeElement($extraTires);
      }

还有我的轮胎实体

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

    public function __construct()
    {
        $this->products = new ArrayCollection();
    }

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;

    /**
     * @ORM\ManyToMany(targetEntity="Product", inversedBy="extraTires")
     * @ORM\JoinTable(name="product_tires",
     *       joinColumns={@ORM\JoinColumn(name="tires_id", referencedColumnName="id")},
     *       inverseJoinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")})
     */
     private $products;

    /**
     * Add products
     *
     * @param Product $products
     * @return Tires
     */
     public function addProduct(Product $products)
    {
        $this->products[] = $products;

        return $this;
    }

    /**
     * Remove products
     *
     * @param Product $products
     */
     public function removeProduct(Product $products)
    {
        $this->products->removeElement($products);
    }

    /**
     * Get products
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
     public function getProducts()
     {
        return $this->products;
     }

我根据doctrine doctumentation 设计了实体。当我添加产品并选择轮胎添加时,连接表中的一切看起来都很好。

我错过了什么?

编辑

我发现了一些东西,但我不完全理解它是如何工作的 :)

当我使用

获取产品实体时,在我的控制器中
$product = $em->getRepository('MyBundle:Product')->find($id);

我必须走进树枝 product.extraTires.owner.extraTires 然后我可以在这里看到我的相关轮胎。突然间,我又对数据库进行了一次查询。所以不知何故我没有正确地在控制器中调用它。

解决方案 似乎控制器中的查询不完整。 $tires 现在返回轮胎数组,你也可以使用 ->getValues() 方法。

$product = $em->getRepository('MyBundle:Product')->find($id);
$tires = $product->getExtraTires()->toArray();

【问题讨论】:

  • 你的测试代码怎么样?
  • 我不确定功能测试在这里是否有用。我试图发出这种音调,但它只是返回带有轮胎的空数组symfony.com/doc/current/cookbook/testing/doctrine.html
  • 只是一个愚蠢的问题,但你在数据库中有“轮胎”吗?你的班级tired@ORM\Entity 注释?
  • @zilongqiu 不好意思我这里忘记把注解复制到类里了,反正我是加在这里的:)

标签: php symfony doctrine-orm many-to-many


【解决方案1】:

Doctrine 不会自动更新内存中的水合对象。内存中的 PHP 对象不会包含更新的关系,除非您从数据库中再次对其进行水合,或者您自己更新内存中的表示。

尝试像下面这样修改加法器(我让你看看如何为移除器执行此操作,但这是相同的想法):

产品:

class Product
{

    public function addExtraTire(Tires $extraTires)
    {
        $this->extraTires[] = $extraTires;

        if (!$extraTires->getProducts()->contains($this) {
            $extraTires->addProduct($this);
        }

        return $this;
    }
}

轮胎:

class Tires
{
    public function addProduct(Product $products)
    {
            $this->products[] = $products;

            if (!$products->getExtraTires()->contains($this) {
                $products->addExtraTire($this);
            }

            return $this;
    }
}

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2015-10-16
    • 1970-01-01
    相关资源
    最近更新 更多