我有一个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开始保留订单?
答案 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