Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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 Symfony2查询生成器向查询添加自定义订单_Php_Mysql_Symfony - Fatal编程技术网

Php Symfony2查询生成器向查询添加自定义订单

Php Symfony2查询生成器向查询添加自定义订单,php,mysql,symfony,Php,Mysql,Symfony,我正在使用QueryBuilder查询我的项目中包含所有联接的所有产品。。然后我使用分页在前端显示它们。有时我需要按照特定的顺序获取它们,但我在QueryBuilder中找不到这样做的方法 例如,一个查询按id返回产品:70,71,72,73,74,75 但是如果我有一些定制订单,我想显示它:72,74,75,70,71,73 因此,在我的querybuilder中,我做了如下操作: public function querySortedProductsInCategories($id, $ty

我正在使用QueryBuilder查询我的项目中包含所有联接的所有产品。。然后我使用分页在前端显示它们。有时我需要按照特定的顺序获取它们,但我在QueryBuilder中找不到这样做的方法

例如,一个查询按id返回产品:70,71,72,73,74,75 但是如果我有一些定制订单,我想显示它:72,74,75,70,71,73

因此,在我的querybuilder中,我做了如下操作:

public function querySortedProductsInCategories($id, $type, $slug, $sort)
{
    $qb = $this->createQueryBuilder('p');
    $qb->addSelect(array('p', 'gallery'));
    $qb->addSelect(array('p', 'media'));
    $qb->addSelect(array('p', 'image'));
    $qb->leftJoin("p." . $type, "c");
    $qb->leftJoin('p.gallery', 'gallery');
    $qb->leftJoin('gallery.galleryHasMedias', 'media');
    $qb->leftJoin('media.media', 'image');
    $qb->where("c." . $type. "= :id ");
    $qb->andWhere($qb->expr()->in('p.id', $sort));
    $qb->SetParameter('id', $id);
    return $qb->getQuery();
}
'SELECT p, p, gallery, p, media, p, image FROM Mp\ShopBundle\Entity\Product p LEFT JOIN p.subcategory c LEFT JOIN p.gallery gallery LEFT JOIN gallery.galleryHasMedias media LEFT JOIN media.media image WHERE c.subcategory= :id  AND p.id IN('70', '73', '76', '72', '71', '74')'
生成的查询如下所示:

public function querySortedProductsInCategories($id, $type, $slug, $sort)
{
    $qb = $this->createQueryBuilder('p');
    $qb->addSelect(array('p', 'gallery'));
    $qb->addSelect(array('p', 'media'));
    $qb->addSelect(array('p', 'image'));
    $qb->leftJoin("p." . $type, "c");
    $qb->leftJoin('p.gallery', 'gallery');
    $qb->leftJoin('gallery.galleryHasMedias', 'media');
    $qb->leftJoin('media.media', 'image');
    $qb->where("c." . $type. "= :id ");
    $qb->andWhere($qb->expr()->in('p.id', $sort));
    $qb->SetParameter('id', $id);
    return $qb->getQuery();
}
'SELECT p, p, gallery, p, media, p, image FROM Mp\ShopBundle\Entity\Product p LEFT JOIN p.subcategory c LEFT JOIN p.gallery gallery LEFT JOIN gallery.galleryHasMedias media LEFT JOIN media.media image WHERE c.subcategory= :id  AND p.id IN('70', '73', '76', '72', '71', '74')'
但返回的数组仍然按Id排序

如果我尝试做以下事情:

    $qb->orderBy("p.id", $sort);
但我当然会得到
数组到字符串的转换
错误

有哪些可能的方法可以做到这一点

public function querySortedProductsInCategories($id, $type, $slug, $sort)
{
    $qb = $this->createQueryBuilder('p');
    $qb->addSelect(array('p', 'gallery'));
    $qb->addSelect(array('p', 'media'));
    $qb->addSelect(array('p', 'image'));
    $qb->leftJoin("p." . $type, "c");
    $qb->leftJoin('p.gallery', 'gallery');
    $qb->leftJoin('gallery.galleryHasMedias', 'media');
    $qb->leftJoin('media.media', 'image');
    $qb->where("c." . $type. "= :id ");
    $qb->andWhere('p.id IN(:ids)');
    $qb->setParameter('ids', $id);
    $qb->orderBy('p.id', 'ASC'); // change to $sort if $sort either ASC or DESC
    return $qb->getQuery();
}
这行吗


这行得通吗?

您可以通过使用原则的queryBuilderfrom函数的indexBy参数来实现这一技巧,但需要一些开销

公共函数from($from,$alias,$indexBy=null)

这将结果数组的索引设置为此参数表中字段的值

然后,您可以按照自己的方式对该数组重新排序

public function querySortedProductsInCategories($id, $type, $slug, $sort)
{
    $qb = $this->createQueryBuilder('p');
    $qb->from('Product', 'p', 'p.id';
    [... the rest of your query]
    $result = $qb->getQuery()->getResult();
    // Here you have an array indexed by the id of your products and you can order it using your $sort array of products ids
    uksort($result,
        function ($key1,$key2) use ($sort) {
            $product1Position = array_search($key1,$sort);
            $product2Position = array_search($key2,$sort);
            if ( $product1Position === false || $product2Position === false) {
                return 0;
            }
            return ($product1Position < $product2Position) ? -1 : 1;
        }
    );
    return $result;
}
公共函数querySortedProductsInCategories($id、$type、$slug、$sort)
{
$qb=$this->createQueryBuilder('p');
$qb->from('Product','p','p.id';
[…其余的问题]
$result=$qb->getQuery()->getResult();
//这里有一个按产品id索引的数组,您可以使用产品id的$sort数组进行订购
结果呢,,
函数($key1,$key2)使用($sort){
$product1Position=array\u search($key1,$sort);
$product2Position=array\u search($key2,$sort);
如果($product1Position==false | |$product2Position==false){
返回0;
}
退货($product1Position<$product2Position)?-1:1;
}
);
返回$result;
}
资料来源:


祝您好运

您可以通过使用条令的queryBuilderfrom函数的indexBy参数以一定的开销完成这项任务

公共函数from($from,$alias,$indexBy=null)

这将结果数组的索引设置为此参数表中字段的值

然后,您可以按照自己的方式对该数组重新排序

public function querySortedProductsInCategories($id, $type, $slug, $sort)
{
    $qb = $this->createQueryBuilder('p');
    $qb->from('Product', 'p', 'p.id';
    [... the rest of your query]
    $result = $qb->getQuery()->getResult();
    // Here you have an array indexed by the id of your products and you can order it using your $sort array of products ids
    uksort($result,
        function ($key1,$key2) use ($sort) {
            $product1Position = array_search($key1,$sort);
            $product2Position = array_search($key2,$sort);
            if ( $product1Position === false || $product2Position === false) {
                return 0;
            }
            return ($product1Position < $product2Position) ? -1 : 1;
        }
    );
    return $result;
}
公共函数querySortedProductsInCategories($id、$type、$slug、$sort)
{
$qb=$this->createQueryBuilder('p');
$qb->from('Product','p','p.id';
[…其余的问题]
$result=$qb->getQuery()->getResult();
//这里有一个按产品id索引的数组,您可以使用产品id的$sort数组进行订购
结果呢,,
函数($key1,$key2)使用($sort){
$product1Position=array\u search($key1,$sort);
$product2Position=array\u search($key2,$sort);
如果($product1Position==false | |$product2Position==false){
返回0;
}
退货($product1Position<$product2Position)?-1:1;
}
);
返回$result;
}
资料来源:


祝你好运

为什么选择4次'p'?orderBy第二个参数只能是'ASC'或'DESC',不要担心4p's…我知道orderBy只能是ASC或DESC,这就是为什么我问在实际查询构建中是否可以按我自己的方式对查询结果排序请看这里:为什么选择4次'p'?orderBy第二个参数可以n只能是'ASC'或'DESC'不要担心4p's…我知道orderBy只能是ASC或DESC,这就是为什么我问是否可以在实际的QueryBuilder中以我自己的方式对查询结果排序请看这里: