J'ai un module qui ajoute de manière programmable beaucoup de nœuds à mon site Drupal 7. Pour éviter les doublons, je veux vérifier si le titre de mon noeud nouvellement créé n'existe pas déjà dans le système. Il n'y aura jamais de cas où deux nœuds ont le même nom. J'ai essayé d'utiliser Je suis excité sur la façon de procéder, alors je me demandais si quelqu'un ici pourrait m'aider. P>
résumer: comment puis-je vérifier si un noeud avec un titre de certains titre existe déjà? P>
Merci. P> node_load () code>, mais cela ne semble pas me permettre de charger des nœuds basés sur un titre. P>
6 Réponses :
Vous pouvez obtenir tous les titres de nœud avec une requête SQL comme: et s'il n'y a aucun résultat renvoyé, vous pouvez supposer que vous êtes prêt à partir. P> < P> ou vous pouvez également modifier la table des nœuds pour rendre le champ de titre unique et gérer l'erreur lancée par MySQL. Ne sais pas vraiment à quel point cela est réalisable. P> P>
+1 C'est le meilleur moyen d'accomplir cela. Vous devriez envisager de rejoindre le tableau des révisions pour obtenir la dernière version des données.
S'il vous plaît, enveloppez votre nom de table dans une attelle bouclée lors de la rédaction de la requête de DB personnalisée.
nœud sont des entités, vous pouvez donc utiliser le EntityFieldQuery classe à interroger pour eux. De cette façon, vous n'avez pas à vous déranger comment les informations sont stockées dans la base de données. Et devrez-vous ajouter des filtres supplémentaires en fonction des valeurs de champs, l'évolution du code sera facile.
C'est une énormément de surcharge pour une requête aussi simple, le stockage sur le terrain ne s'étend pas aux propriétés de l'entité afin d'utiliser EntityFieldQuery ici n'a pas d'avantage réel
Oui, il y a des frais généraux en utilisant l'entitéfieldQuery pour interroger une propriété de nœud unique. Mais comme cela ne s'appliquera qu'à un processus de création multi-nœuds, il est possible que le coût de la performance soit marginal. Et il sera plus facile de maintenir si le processus de création de nœud évolue dans quelque chose qui devrait vérifier plusieurs conditions.
Si vous utilisez la traduction d'entité et le module de titre, le code doit être mis à jour pour interroger le champ Title_field au lieu de la propriété Titre.
Je sais que c'est de nombreuses années plus tard, mais il y a un bogue dans ce code - vous ne pouvez pas chaîner un constructeur PHP. En 5.4 et up, vous pouvez utiliser (nouvelle entitéfieldQuery ()) -> code>, mais comme écrit cela devrait donner une erreur fatale.
juste une headsup amicale. Pour la sécurité, vous devriez Donc, il devrait être: (Avis {noeud}) p>
Pour une requête de nœud, il semble que, pour avoir la vérification des restrictions d'accès au nœud, vous devez utiliser une requête dynamique avec la balise "Node_Access", voir drupal.org/update/modules/6/7#db_rewrite_sql . Pour ce cas, cela n'a pas d'importance car la détection du titre en double ne devrait pas s'inquiéter des restrictions d'accès au nœud. Mais en utilisant une requête dynamique pour les nœuds, c'est une bonne habitude de prendre.
Les supports bouclés ne sont que pour préfixer la table si vous avez votre préfixe dans votre fichier de paramètres. n'a rien à voir avec l'injection SQL. J'utilise l'API D7 SQL pour ajouter des champs et des conditions dans votre exemple si je devais deviner, votre variable $ MyNewtiTle n'est pas échappée?
Voici cette approche D7 utilise l'API et la fonction de comptage.
$query = db_select('node', 'n') ->fields('n', array('nid')) ->condition('n.title', $myNewTitle, '='); return $query->countQuery()->execute()->fetchField();
node_load_multiple(array(), array('title' => $title)); Source: The guts of DrupalWebTestCase::DrupalGetNodeByTitle
La bonne façon est d'ajouter un index unique à la base de données.
Ensuite, vous serez sûr que tous les titres sont uniques.
Est facile:
Si vous voulez que nous puissions déplacer cela sur notre [site drupal] (drupal.stackexchange.com) où il pourrait obtenir une meilleure couverture. S'il vous plaît signaler si vous souhaitez que nous fassions cela (mais ne vous croisez pas). Merci.
Connexes: Comment charger un nœud basé sur son titre? à DS