2012-07-04 32 views
13

Có thể thay đổi giá trị khóa mảng cho getResult() trong Doctrine2 không?Thay đổi khóa mảng getResult cho giá trị khóa chính

Ví dụ:

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

Khi tôi in này, tôi nhận được, mà không phải là những gì tôi muốn:

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

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

Những gì tôi muốn là:

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

Gợi ý, gợi ý sẽ được đánh giá cao.

Trả lời

31

Tôi thực sự rất hài lòng về cách mát điều này là:

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

chỉ mục bằng cách xây dựng là gì mà trực tiếp chuyển thành SQL nhưng điều đó ảnh hưởng đến đối tượng và mảng hydrat hóa. Sau mỗi mệnh đề FROM và JOIN bạn chỉ định theo trường nào, lớp này sẽ được lập chỉ mục trong kết quả . Theo mặc định, kết quả được tăng lên bằng các phím số bắt đầu từ với 0. Tuy nhiên với INDEX BY bạn có thể chỉ định bất kỳ cột nào khác là khóa của kết quả của bạn, nó thực sự chỉ hợp lý với trường chính hoặc .

Nguồn: Doctrine ORM 2 Documentation Using INDEX BY

  • Vui lòng sử dụng INDEX THEO trước ĐÂU
+0

Cách tiếp cận thú vị nhưng dường như không hoạt động với MySql 5.6.16. Phải không? –

+2

@ MatthewT.Baker Nó không phải là SQL, nó là DQL và như đã đề cập, không dịch sang bất cứ điều gì trong kết quả truy vấn SQL. – Omn

14

Tuy nhiên, vì lợi ích của sự hoàn chỉnh, bạn có thể làm tương tự với những người xây dựng truy vấn như hình dưới đây:

$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() 
); 

Như bạn có thể thấy chỉ số theo tùy chọn có sẵn như là tham số thứ ba của người xây dựng truy vấn from phương pháp:

/** 
* 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); 
} 
0

Chỉ cần sử dụng các tham số 3-thứ của ->from(entity, alias, indexBy)

Vì vậy, thay vì

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

sử dụng

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

PS: @Francesc o-Casula đã viết câu trả lời tốt với ít chi tiết hơn, tốt.

Các vấn đề liên quan