Saya memiliki kode berikut yang memberi saya kesalahan:
Message: Invalid parameter number: number of bound variables does not match number of tokens
Kode:
public function getCount($ids, $outcome)
{
if (!is_array($ids)) {
$ids = array($ids);
}
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->add('select', $qb->expr()->count('r.id'))
->add('from', '\My\Entity\Rating r');
if ($outcome === 'wins') {
$qb->add('where', $qb->expr()->in('r.winner', array('?1')));
}
if ($outcome === 'fails') {
$qb->add('where', $qb->expr()->in('r.loser', array('?1')));
}
$qb->setParameter(1, $ids);
$query = $qb->getQuery();
//die('q = ' . $qb);
return $query->getSingleScalarResult();
}
Data (atau $ ids):
Array
(
[0] => 566
[1] => 569
[2] => 571
)
Hasil DQL:
q = SELECT COUNT(r.id) FROM \My\Entity\Rating r WHERE r.winner IN('?1')
php
doctrine-orm
query-builder
Tjorriemorrie
sumber
sumber
Jawaban:
Dalam meneliti masalah ini, saya menemukan sesuatu yang akan menjadi penting bagi siapa pun yang mengalami masalah yang sama ini dan mencari solusi.
Dari postingan asli, baris kode berikut:
Membungkus parameter bernama sebagai array menyebabkan masalah nomor parameter terikat. Dengan menghapusnya dari pembungkus lariknya:
Masalah ini harus diperbaiki. Ini mungkin menjadi masalah di versi Doktrin sebelumnya, tetapi telah diperbaiki di versi terbaru 2.0.
sumber
$qb->expr()->in()
hanya ada di Doctrine 2 ORM, tapi tidak di Doctrine DBAL.$qb->expr()->in()
memang ada di DBALCara termudah untuk melakukannya adalah dengan mengikat array itu sendiri sebagai parameter:
sumber
->where('b.status IN (:statuses)') ->setParameters([ 'customerId' => $customerId, 'storeId' => $storeId, 'statuses' => [Status::OPEN, Status::AWAITING_APPROVAL, Status::APPROVED] ]);
setParameter
untuk memaksaConnection::PARAM_STR_ARRAY
dan untuk menyelesaikan solusi string
sumber
Saya menemukan bahwa, terlepas dari apa yang ditunjukkan oleh dokumen, satu-satunya cara agar ini berfungsi adalah seperti ini:
http://groups.google.com/group/doctrine-dev/browse_thread/thread/fbf70837293676fb
sumber
Saya tahu ini adalah posting lama tetapi mungkin berguna untuk seseorang. Saya akan memilih & meningkatkan jawaban @Daniel Espendiller dengan menjawab pertanyaan yang diajukan dalam komentar tentang int
Untuk membuat ini berfungsi untuk int dengan cara yang tepat, pastikan nilai dalam array bertipe int, Anda dapat mengetik cast to int sebelum meneruskan ...
Diuji untuk memilih / menghapus di symfony 3.4 & doktrin-bundle: 1.8
sumber
Saya tahu contoh OP menggunakan DQL dan pembuat kueri, tetapi saya menemukan ini mencari cara melakukannya dari pengontrol atau di luar kelas repositori, jadi mungkin ini akan membantu orang lain.
Anda juga dapat melakukan a
WHERE IN
dari pengontrol dengan cara ini:sumber
Cara terbaik melakukan ini - terutama jika Anda menambahkan lebih dari satu ketentuan - adalah:
Jika larik nilai Anda berisi string, Anda tidak dapat menggunakan metode setParameter dengan string yang di-implode, karena tanda kutip Anda akan di-escape!
sumber
Beginilah cara saya menggunakannya:
sumber
Menemukan cara melakukannya di tahun 2016: https://redbeardtechnologies.wordpress.com/2011/07/01/doctrine-2-dql-in-statement/
Mengutip:
Berikut cara melakukannya dengan benar:
Metode ini
setParameters
akan mengambil array yang diberikan dan mengimpode dengan benar untuk digunakan dalam pernyataan "IN".sumber
:userids
)Saya lebih memilih:
sumber
Juga bekerja dengan:
sumber
Saya berjuang dengan skenario yang sama di mana saya harus melakukan kueri terhadap berbagai nilai.
Yang berikut berhasil untuk saya:
http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/dql-doctrine-query-language.html#where-clause
Contoh data array (bekerja dengan string dan integer):
Contoh kueri (Sesuaikan dengan kebutuhan Anda):
sumber
Ini bertahun-tahun kemudian, mengerjakan situs warisan ... Selama hidup saya, saya tidak bisa mendapatkan solusi
->andWhere()
atau->expr()->in()
bekerja.Akhirnya melihat di Doctrine mongodb-odb repo dan menemukan beberapa tes yang sangat terbuka:
Itu berhasil untuk saya!
Anda dapat menemukan pengujian di github di sini . Berguna untuk mengklarifikasi segala macam omong kosong.
Catatan: Setup saya menggunakan Doctrine MongoDb ODM v1.0.dev sejauh yang saya bisa.
sumber