J'utilise Propel 1.6 et je ne sais pas comment obtenir un objet (compte tenu de sa valeur d'attribut "ID") d'une collection d'objets propulseurs. Je ne pouvais pas trouver une réponse directe dans la documentation de Propel ( PropelCollection Methodes ne semble pas applicable?). Par exemple: Disons que j'ai une table "personne" avec le schéma suivant:
foreach ($books as $book) { $book['author_name'] = PersonQuery::create()->findOneById($book['author_id'])->getName(); }
5 Réponses :
Eh bien, cela ne sera pas très efficace, mais vous pouvez passer par la collection pour le trouver.
$persons = PersonQuery::create()->find(); foreach ($persons as $person) { if (3 == $person->getId()) { break; } } // now you have your person with id = 3 var_dump($person->getId());
Vous pouvez le faire de manière plus élégante avec array_filter () code> :-)
@ J0K: J'essayais d'éviter une boucle foreach, mais je suppose que, comme vous le suggérez, je ne peux pas l'éviter. Je pense qu'avoir avec la boucle serait toujours plus efficace que de faire plusieurs connexions de base de données. Merci pour votre réponse!
@Florent: Je ne sais pas comment implémenter le fonction Array_Filter Dans ce cas, mais je vais enquêter ... merci!
Depuis que Propel ne se cache pas correctement Résultat de la requête, vous devez itérer la collection (comme foreach code>, vous pouvez appeler
array_filter code> en passant une fermeture (avec PHP 5.3).
// Filter the person whose ID equals 3
$person = array_filter($persons, function ($person) {
return 3 === $person->getId();
})[0];
Merci d'avoir partagé une solution alternative à l'aide de Array_Filter! Cette solution serait-elle meilleure d'un point de vue de performance, par rapport à l'utilisation d'une boucle de foresach? Si oui, pourriez-vous partager l'intuition derrière?
Avec PHP 5.4, foreach code> est 3 fois plus rapide que
array_filter () code>. En outre, en utilisant
foreach code>, vous pouvez
break code> lorsque votre entrée est trouvée. Mais à mon avis
array_filter () code> est plus esthétique i>.
Si vous définissez Propel :: isinstancepoolingenabled () est vrai (c'est vrai par défaut), vous pouvez
// Request the persons $persons = PersonQuery::create()->find(); // get person from pool $person = PersonPeer::getInstanceFromPool(3);
L'alternative avec propulseur> = 1,5 à la réponse d'User2663223 serait la suivante:
$persons = PersonQuery::create()->find() $person = PersonQuery::create()->findPk(3);
Une autre alternative, surtout si vous devez rechercher plusieurs fois, c'est obtenir une éventail d'objets par ID avec $ Collection-> getarrayCopy ('ID').
if (isset($personsById[3])) { $person = $personsById[3]; ... }