Kri*_*ris 30 symfony doctrine-orm
我有一个产品类,其上有许多字段,用于ManyToMany,例如成分,大小,种类等.共有大约14个不同的字段并非所有字段都与每个产品相关.
我有这样的映射设置
Class product {
/**
* @var Species[]
* @ORM\ManyToMany(targetEntity="Species")
* @ORM\JoinTable(name="product_species",
* joinColumns={@ORM\JoinColumn(name="productId", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="speciesId", referencedColumnName="id")}
* )
* @ORM\OrderBy({"name" = "asc"})
*/
private $species;
Run Code Online (Sandbox Code Playgroud)
这适用于许多人/多人.
问题出在我的product_ingredients表中我需要添加一个额外的字段,这意味着需要从ManyToMany切换到OneToMany/ManyToOne所以就像这样
/**
* @var ProductIngredient[]
*
* @ORM\OneToMany(targetEntity="ProductIngredient", mappedBy="product")
* @ORM\JoinColumn(name="productId", referencedColumnName="id")
*/
private $ingredients;
Run Code Online (Sandbox Code Playgroud)
现在我的ProductIngredient实体看起来像这样
/**
* @var IngredientType
* @ORM\ManyToOne(targetEntity="IngredientType", fetch="EAGER")
* @ORM\JoinColumn(name="ingredientTypeId", referencedColumnName="id")
*/
private $ingredientType;
/**
* @var Ingredient
*
* @ORM\ManyToOne(targetEntity="Ingredient", inversedBy="products", fetch="EAGER")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="ingredientId", referencedColumnName="id")
* })
*/
private $ingredient;
/**
* @var Product
*
* @ORM\ManyToOne(targetEntity="Product", inversedBy="ingredients")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="productId", referencedColumnName="id")
* })
*/
private $product;
Run Code Online (Sandbox Code Playgroud)
所以在我的物种产品类中,我使用@ORM\OrderBy,以便物种已经订购.有没有办法我可以以某种方式为我的配料领域做这个?
或者我的逻辑是错误的,这些甚至不应该是产品类中的字段,而应该只是通过存储库查找?
我希望它变得简单,所以我可以循环遍历我的对象$product->getIngredients()
而不是做
$ingredients = $this->getDoctrine()->getRepository('ProductIngredient')->findByProduct($product->getId());
Run Code Online (Sandbox Code Playgroud)
And*_*den 73
在Product实体中也只是将orderBy添加到成分关系中
/**
* ...
* @ORM\OrderBy({"some_attribute" = "ASC", "another_attribute" = "DESC"})
*/
private $ingredients;
Run Code Online (Sandbox Code Playgroud)
好吧我想出了一个hackish方式..因为我真的只关心输出的排序,我做了一个基本的枝条扩展
use Doctrine\Common\Collections\Collection;
public function sort(Collection $objects, $name, $property = null)
{
$values = $objects->getValues();
usort($values, function ($a, $b) use ($name, $property) {
$name = 'get' . $name;
if ($property) {
$property = 'get' . $property;
return strcasecmp($a->$name()->$property(), $b->$name()->$property());
} else {
return strcasecmp($a->$name(), $b->$name());
}
});
return $values;
}
Run Code Online (Sandbox Code Playgroud)
我想避免这种黑客,但仍想知道一个真正的解决方案
| 归档时间: |
|
| 查看次数: |
43771 次 |
| 最近记录: |