簡體   English   中英

更改主鍵值的getResult數組鍵

[英]Change the getResult array key for the primary key value

是否可以在Doctrine2中更改getResult()的數組鍵值?

例:

$qb->select('t.id, t.name')->from('Table', 't');

當我打印這個時,我得到了,這不是我想要的:

print_r($qb->getQuery()->getResult());

//Print result: Array ( [0] => Array ( [id] => 20 [name] => Name1 ) [1] => Array ( [id] => 21 [percentagem] => Name2 ) )

我想要的是:

Array ( [20] => Array ( [id] => 20 [name] => Name1 ) [21] => Array ( [id] => 21 [percentagem] => Name2 ) )

建議,提示將不勝感激。

我真的很高興這件事有多酷:

$query = $this->getEntityManager()->createQuery('
            SELECT user FROM UserBundle:User user
            INDEX BY user.id
            WHERE user.id = 1
            '
        );

INDEX BY構造不會直接轉換為SQL,但會影響對象和數組的水合作用。 在每個FROM和JOIN子句之后,您可以指定此類應在結果中編入索引的字段。 默認情況下,結果會以從0開始的數字鍵遞增。但是使用INDEX BY,您可以指定任何其他列作為結果的鍵,但它實際上只對主要或唯一字段有意義。

來源: 使用INDEX BY的Doctrine ORM 2文檔

  • 請在WHERE之前使用INDEX BY

但是,為了完整起見,您可以對查詢構建器執行相同操作,如下所示:

$queryBuilder = $this->getEntityManager()->createQueryBuilder();

$queryBuilder
    ->select('user')
    ->from('UserBundle:User', 'user', 'user.id')
    ->where('user.id = :userId')
    ->setParameter('userId', $userId)
;

var_dump(
    $queryBuilder->getQuery()->getArrayResult()
);

正如你可以看到選項的指數可作為查詢生成器的第三個參數from方法:

/**
 * Creates and adds a query root corresponding to the entity identified by the given alias,
 * forming a cartesian product with any existing query roots.
 *
 * <code>
 *     $qb = $em->createQueryBuilder()
 *         ->select('u')
 *         ->from('User', 'u')
 * </code>
 *
 * @param string $from    The class name.
 * @param string $alias   The alias of the class.
 * @param string $indexBy The index for the from.
 *
 * @return QueryBuilder This QueryBuilder instance.
 */
public function from($from, $alias, $indexBy = null)
{
    return $this->add('from', new Expr\From($from, $alias, $indexBy), true);
}

只需使用->from(entity, alias, indexBy)第3個參數

所以與其

$qb->select('t.id, t.name')->from('Table', 't');

使用

$qb->select('t.id, t.name')->from('Table', 't', 'Table.id');

PS:@ Francesco-Casula用更多的細節寫出了很好的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM