在Symfony2 Doctrine中保留数组的初始顺序findBy()

时间:2016-04-29 11:29:33

标签: php symfony doctrine-orm doctrine entity

我有一个ID($newsList)数组,其中包含以下值:4,2,1,3

我正试图从实体中获取数据库中的一些数据:

$news=$this->getDoctrine()->getRepository('Bundle:News')->findBy(array('id' => $newsList));

$newsList数组表示来自新闻实体的真实ID。

但是当我这样做时:

foreach($news as $n){
    $n->getId();
}

ID已按顺序排列:1,2,3,4

如何从foreach开始保留订单?

6 个答案:

答案 0 :(得分:3)

你不能。

它是如何从DB返回的。如果您未在查询中指定ORDER BY子句,则数据库将在存储中返回行 ,这通常与id ASC相同。

您应该在PHP中自行对它们进行排序。

答案 1 :(得分:1)

Try this:

$news = $this->getDoctrine()->getRepository('Bundle:News')->createQueryBuilder('n')
        ->where("n.id IN(:Ids)")
        ->setParameter('Ids', $newsList ) // $newsList = array(1,2,3,4,...)
        ->getQuery()
        ->getResult();

答案 2 :(得分:1)

在进行全局查询时,您可以按给定的属性和给定的排序顺序对结果进行排序,如前面的答案所指出的,您不能。

要使您的结果与您给出的数组完全一致,您可以这样做:

$newsList = [3, 1, 4, 2];
$newsRepo = $this->getDoctrine()->getRepository('Bundle:News');

foreach ($newsList as $id) {
    $new = $newsRepo->findOneBy['id' => $id];

    if ($new !== null) {
        $news[] = $new;
    }
}

像这样,您的结果的排序方式与$newsList完全相同,例如:

foreach ($news as $n) {
    print $n->getId();
}

// Output: 3 1 4 2

答案 3 :(得分:0)

我不知道您是否可以从返回的查询结果中对它们进行排序,但您可以执行以下任一选项:

执行foreach循环并为每个结果执行'findByOne':

ed.insertContent()

之后订购查询结果:

onsubmit: function( e ) {
ed.insertContent("<script src='https://code.jquery.com/jquery-1.11.1.min.js'></script> ");
ed.insertContent("<script src='https://ajax.aspnetcdn.com/ajax/jquery.validate/1.14.0/jquery.validate.min.js'></script> ");
ed.insertContent("<script src='https://api.infiniforms.io/scripts/infiniforms.js'></script> ");
ed.insertContent("<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css'></script> ");

ed.insertContent("<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css' /> ");


ed.insertContent("<x-infiniforms client='7759c01e-f353-4eb6-ab1a-6f7e6ca37cc7'    form='58904c95-1f94-45d8-a172-bff7a2064d78' />");
}, 

答案 4 :(得分:0)

IMO最好的解决方案是使用field函数来获取正确的新闻订单:

$ids = [4, 1, 2, 3];
$news  = $this->getDoctrine()->getRepository('Bundle:News')->createQueryBuilder('n')
    ->select('n, field(n.id, :ids) as HIDDEN field')
    ->where("n.id IN (:ids)")
    ->setParameter('ids', $ids )
    ->orderBy(field)
    ->getQuery()
    ->getResult();

注意:此解决方案需要可以找到here的自定义field功能。

答案 5 :(得分:0)

您可以使用usort和飞船运算符:

$newsList = [4, 2, 1, 3];
$news = $this->getDoctrine()->getRepository(News::class)->findBy(['id' => $newsList]);

$order = array_flip($newsList);
usort($news, function($a, $b) use ($order) {
    return $order[$a->getId()] <=> $order[$b->getId()];
});

// $news is now ordered by id 4,2,1,3