Symfony 2,从多对多关联中获取实体
Symfony 2, get entity from Many To Many association
我有实体 Product
和 Tires
。
一种产品有更多轮胎,一种轮胎可以用于更多产品。
在我调用
时在我的控制器中
$product = $em->getRepository('MyBundle:Product')->find($id);
或
$tires = $product->getExtraTires();
Related Tires won't return.
/**
* 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 并选择轮胎添加时,在 join table.
中一切看起来都正常
我错过了什么?
编辑
我找到了一些东西,但我不完全明白它是如何工作的:)
当我使用
获取产品实体时在我的控制器中
$product = $em->getRepository('MyBundle:Product')->find($id);
我必须进入
product.extraTires.owner.extraTires
然后我可以在这里看到我相关的轮胎。突然间我又对数据库进行了一次查询。所以不知何故我没有在控制器中正确调用它。
解决方案
似乎控制器中的查询不完整。 $tires
现在 return 个轮胎数组,您也可以使用 ->getValues() 方法。
$product = $em->getRepository('MyBundle:Product')->find($id);
$tires = $product->getExtraTires()->toArray();
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;
}
}
我有实体 Product
和 Tires
。
一种产品有更多轮胎,一种轮胎可以用于更多产品。
在我调用
时在我的控制器中$product = $em->getRepository('MyBundle:Product')->find($id);
或
$tires = $product->getExtraTires();
Related Tires won't return.
/**
* 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 并选择轮胎添加时,在 join table.
中一切看起来都正常我错过了什么?
编辑
我找到了一些东西,但我不完全明白它是如何工作的:)
当我使用
获取产品实体时在我的控制器中$product = $em->getRepository('MyBundle:Product')->find($id);
我必须进入 product.extraTires.owner.extraTires 然后我可以在这里看到我相关的轮胎。突然间我又对数据库进行了一次查询。所以不知何故我没有在控制器中正确调用它。
解决方案
似乎控制器中的查询不完整。 $tires
现在 return 个轮胎数组,您也可以使用 ->getValues() 方法。
$product = $em->getRepository('MyBundle:Product')->find($id);
$tires = $product->getExtraTires()->toArray();
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;
}
}