Saya menggunakan QueryBuilder Doctrine untuk membangun kueri, dan saya ingin mendapatkan jumlah total hasil dari kueri.
$repository = $em->getRepository('FooBundle:Foo');
$qb = $repository->createQueryBuilder('n')
->where('n.bar = :bar')
->setParameter('bar', $bar);
$query = $qb->getQuery();
//this doesn't work
$totalrows = $query->getResult()->count();
Saya hanya ingin menjalankan hitungan pada permintaan ini untuk mendapatkan baris total, tetapi tidak mengembalikan hasil yang sebenarnya. (Setelah kueri hitung ini, saya akan lebih jauh memodifikasi kueri dengan maxResults untuk pagination.)
symfony
doctrine-orm
Acyra
sumber
sumber
Jawaban:
Sesuatu seperti:
Beberapa orang merasa bahwa ekspresi entah bagaimana lebih baik daripada hanya menggunakan DQL lurus. Bahkan ada yang mengedit jawaban empat tahun. Saya memutar kembali editnya. Sosok pergi.
sumber
bar = $bar
);)count()
pada$query->getResult()
sebenarnya membuat permintaan mengembalikan hasil (yang tidak dia inginkan). saya pikir ini harus diterima jawaban$qb->select($qb->expr()->count('account.id'))
select('count(account.id)')
bukanselect('count(account)')
?Berikut ini cara lain untuk memformat kueri:
sumber
return ($qb = $repository->createQueryBuilder('u'))->select($qb->expr()->count('u.id'))->getQuery()->getSingleScalarResult();
Lebih baik untuk memindahkan semua logika bekerja dengan database ke repositori.
Jadi di controller Anda menulis
Dan masuk
Repository/FooRepository.php
Lebih baik pindah
$qb = ...
ke baris terpisah jika Anda ingin membuat ekspresi yang kompleks sepertiJuga pikirkan tentang caching hasil kueri Anda - http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers
Dalam beberapa kasus sederhana menggunakan
EXTRA_LAZY
hubungan entitas baikhttp://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html
sumber
Jika Anda perlu menghitung kueri yang lebih kompleks, dengan
groupBy
,having
dll ... Anda dapat meminjam dariDoctrine\ORM\Tools\Pagination\Paginator
:sumber
SELECT COUNT(*) AS dctrn_count FROM (_ORIGINAL_SQL_) dctrn_result) dctrn_table
yang sebenarnya tidak ada yang istimewa tetapi solusi COUNT (*) yang terkenalKarena
Doctrine 2.6
dimungkinkan untuk menggunakancount()
metode langsung dariEntityRepository
. Untuk detailnya lihat tautan.https://github.com/doctrine/doctrine2/blob/77e3e5c96c1beec7b28443c5b59145eeadbc0baf/lib/Doctrine/ORM/EntityRepository.php#L161
sumber
Contoh bekerja dengan pengelompokan, penyatuan dan hal-hal lainnya.
Masalah:
Agar ini berfungsi, solusi yang mungkin adalah dengan menggunakan custom hydrator dan hal aneh ini disebut 'CUSTOM OUTPUT WALKER HINT':
sumber
Untuk orang-orang yang hanya menggunakan DBAL Doktrin dan bukan ORM Doktrin, mereka tidak akan dapat mengakses
getQuery()
metode karena itu tidak ada. Mereka perlu melakukan sesuatu seperti berikut ini.sumber
Untuk menghitung item setelah beberapa item (offset), $ qb-> setFirstResults () tidak dapat diterapkan dalam kasus ini, karena berfungsi bukan sebagai kondisi permintaan, tetapi sebagai offset hasil permintaan untuk berbagai item yang dipilih ( yaitu setFirstResult tidak dapat digunakan untuk mengumpulkan COUNT sama sekali). Jadi untuk menghitung item, yang tersisa saya hanya melakukan hal berikut:
Adakah yang tahu cara yang lebih bersih untuk melakukannya?
sumber
Menambahkan metode berikut ke repositori Anda akan memungkinkan Anda menelepon
$repo->getCourseCount()
dari Kontroler Anda.sumber
Anda juga bisa mendapatkan jumlah data dengan menggunakan fungsi hitung.
sumber