La Doctrine - Comment lier tableau pour le SQL?
Mon SQL ressemble à quelque chose comme ceci:
$sql = "select * from user where id in (:userId) and status = :status";
$em = $this->getEntityManager();
$stmt = $em->getConnection()->prepare($sql);
$stmt->bindValue(':userId', $accounts, \Doctrine\DBAL\Connection::PARAM_INT_ARRAY);
$stmt->bindValue(':status', 'declined');
$stmt->execute();
$result = $stmt->fetchAll();
Mais il retourne:
Une exception s'est produite lors de l'exécution (...)
avec params
[[1,2,3,4,5,6,7,8,11,12,13,14], "refusé"]Avis: Tableau de conversion de chaîne de caractères
Je ne peux pas l'utilisateur queryBuilder
parce que mon vrai SQL est plus compliqué (ex. contient rejoint sélectionner, syndicats, etc)
Pouvez-vous utiliser foreach?
foreach($accounts as $key => $val) { $stmt->bindValue(':userId', $val); }
OriginalL'auteur breq | 2016-05-13
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser les requêtes préparées avec des tableaux tout simplement parce que sql lui-même ne prend pas en charge les tableaux. Ce qui est une véritable honte. Quelque part le long de la ligne que vous avez réellement besoin pour déterminer si vos données contiennent trois éléments et émettent un (?,?,?). L'ORM Doctrine de l'entité gestionnaire de fait cela pour vous automatiquement.
Heureusement, la DBAL vous a couvert. Vous n'utilisez surtout pas de les lier ou de les préparer. Le manuel est un exemple: http://doctrine-orm.readthedocs.io/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#list-of-parameters-conversion
Dans votre cas, il ressemblerait à quelque chose comme:
Le code ci-dessus n'est pas testée, mais vous devriez obtenir l'idée. (Assurez-vous que vous
use Doctrine\DBAL\Connection;
pourConnection::PARAM_INT_ARRAY
)Remarque pour les personnes utilisant des paramètres nommés:
Si vous utilisez les paramètres nommés (
:param
au lieu de?
), vous devez respecter les noms de paramètre lors de la fourniture de types. Par exemple:Je comprends l'inquiétude et les paramètres nommés sont sympa, mais pensez-y, vous ne disposez que de deux paramètres. Pas difficile de les garder en ordre. Lorsque vous traitez avec des requêtes avec un plus grand nombre de paramètres, j'utilise le dbal query builder pour générer le sql et fondamentalement ajouter des valeurs à mes $valeurs du tableau, comme je vais le long. Il n'est pas si mal une fois que vous vous habituez à elle. Et il vous évite d'avoir à décider de ce que les paramètres doivent être nommés en premier lieu. La dénomination est toujours difficile.
Mais mu real SQL est plus complexe pastebin.com/1JiRHFdc, toutes les idées comment faire ce "droit"? Il contient aussi plus de variables et où clausure si l'utilisateur décide de plus filtrer les résultats
Commencez par utiliser le DBAL générateur de requêtes. Dans ce cas, vous disposez de deux $qb des objets. Un pour la sélection interne et l'autre pour la sélection externe. Utiliser $qb->toSQL() pour nourrir la sélection interne dans l'externe. Ensuite, c'est juste une question de garder votre $valeurs $et les types de tableau dans la synchronisation. Aussi loin que supplémentaires de supplémentaires où l'une des clauses, peut-être prendre un coup d'oeil ici: sitepoint.com/community/t/....
Que dois-je faire ensuite? pastebin.com/WwWeyaRh
OriginalL'auteur Cerad
Si vous voulez coller à la
:param
syntaxe où l'ordre n'a pas d'importance, vous avez à faire un peu de travail supplémentaire, mais je vais vous montrer un moyen facile de lier les paramètres:Dans ce cas, nous nous retrouvons avec:
"select * from user where id in (:id_0,:id_1,:id_2,:id_3) and status = :status"
Cette approche permettra également de travailler avec un tableau de chaînes de caractères.
OriginalL'auteur user7191321
Vous avez besoin de les envelopper dans un tableau
http://doctrine-dbal.readthedocs.io/en/latest/reference/data-retrieval-and-manipulation.html#list-of-parameters-conversion
modifier
Je devrais avoir plus élaboré. Vous ne pouvez pas lier un tableau comme ça, ne pas préparer le sql execute directement comme l'exemple de la doc.
Warning: PDOStatement::bindValue() expects parameter 3 to be integer, array given
. Je suis à l'aide deprepare
méthode, pasexecuteQuery
OriginalL'auteur Akash