Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按联接表的列对多个关系排序_Php_Symfony_Annotations_Doctrine - Fatal编程技术网

Php 按联接表的列对多个关系排序

Php 按联接表的列对多个关系排序,php,symfony,annotations,doctrine,Php,Symfony,Annotations,Doctrine,在带有注释的实体中,是否可以通过联接表的列对多个关系进行排序 我已经试着让它与@ORM\JoinTable和@ORM\jointcolumn一起工作,但这似乎不起作用 类产品{ /** *@ORM\ManyToMany(targetEntity=“App\Entity\Category”) *@ORM\OrderBy({“name”=“ASC”}) */ 私人类别; } 类别{ 使用Knp\translateable; } 类别翻译{ 使用Knp\翻译; /** *@ORM\Column(t

在带有注释的实体中,是否可以通过联接表的列对多个关系进行排序

我已经试着让它与
@ORM\JoinTable
@ORM\jointcolumn
一起工作,但这似乎不起作用

类产品{
/**
*@ORM\ManyToMany(targetEntity=“App\Entity\Category”)
*@ORM\OrderBy({“name”=“ASC”})
*/
私人类别;
}
类别{
使用Knp\translateable;
}
类别翻译{
使用Knp\翻译;
/**
*@ORM\Column(type=“string”,长度=255)
*/
私人$name;
}

我想做一些类似于
@OrderBy({“CategoryTranslation.name”=“ASC”)的事情
在产品实体中。或者有没有办法在
@manytomy
注释中执行存储库方法来手动构建查询,以选择具有正确顺序的类别?

不确定您是否可以通过注释来完成,但我已经通过一个简单的
uasort
函数实现了您想要的结果<代码>产品实体为您的
getCategories()
getter尝试以下方法

public function getCategories()
{
    $categories = $this->categories;

    uasort($catetories, [$this, 'mySortCategories']);

    return $categories;
}

private function mySortCategories(Category $cat1, Category $cat2)
{
    if ($cat1->getName() === $cat2->getName()) {
        return 0;
    }
    return ($cat1->getName() < $cat2->getName()) ? -1 : 1;
}
公共函数getCategories()
{
$categories=$this->categories;
uasort($catetories,[$this,'myportcategories']);
返回$categories;
}
私有函数mySortCategories(类别$cat1、类别$cat2)
{
如果($cat1->getName()==$cat2->getName()){
返回0;
}
返回($cat1->getName()<$cat2->getName())?-1:1;
}

我最终用@ehymel在回答中描述的方法解决了这个问题,但我使用的是ArrayIterator对象的uasort方法。我对这个解决方案不太满意,因为getter方法中使用了一个额外的
$locale
参数,我更喜欢用SQL/DQL对项目进行排序,而不是一个额外的PHP循环这很有效

公共函数getCategories(?string$locale=null)
{
$iterator=$this->categories->getIterator();
$iterator->uasort(函数(类别$a,类别$b)使用($locale){
返回($a->translate($locale)->getName()<$b->translate($locale)->getName())?-1:1;
});
返回新的ArrayCollection(迭代器_to_数组($迭代器));
}

我想说实现这一点的唯一方法(在db中)是使用DQL。
类别翻译。name
将“神奇地”要求翻译始终被连接(具有讽刺意味的是,它可能是)。然而,默认关联显然被称为
translations
,因此您可以尝试
translations.name
,看看它是否有效。然而,一对多在子字段方面是出了名的笨拙,所以我打赌它不会起作用。@Jakumi我做了一些测试,遗憾的是,正如您提到的,这两种方法都不起作用。我会的仍然更喜欢使用注释(SQL)对类别进行排序而不是在getter中使用PHP进行额外的循环。你知道有没有执行存储库方法来获取类别的方法?或者我可以编写一个自定义注释来扩展Doctrine
@OrderBy
注释。我可能会尝试这样做:在
产品::getCategories
内部,并希望
翻译。name
在那里工作。但是,请注意,这只有在仅使用一个产品时才是明智的,否则您可能会遇到n+1问题。但本质上,对于n+1问题,您只需在其他地方使用标准(在产品的特殊存储库功能中)。虽然我更喜欢用注释来解决这个问题,但这是我目前找到并为我工作的唯一解决方案。谢谢@ehymel。为了将来的参考和有相同问题的人,我自己发布了一个答案,展示我最终是如何解决的。