9
votes

Comment obtenir un objet par "ID" de la collection d'objets propulseurs?

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();
}


0 commentaires

5 Réponses :


4
votes

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());


3 commentaires

Vous pouvez le faire de manière plus élégante avec array_filter () :-)


@ 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!



3
votes

Depuis que Propel ne se cache pas correctement Résultat de la requête, vous devez itérer la collection (comme @ j0k strong> dit). Au lieu d'utiliser une boucle 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];


2 commentaires

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 est 3 fois plus rapide que array_filter () . En outre, en utilisant foreach , vous pouvez break lorsque votre entrée est trouvée. Mais à mon avis array_filter () est plus esthétique .



2
votes

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);


0 commentaires

1
votes

L'alternative avec propulseur> = 1,5 à la réponse d'User2663223 serait la suivante:

$persons = PersonQuery::create()->find()

$person = PersonQuery::create()->findPk(3);


0 commentaires

8
votes

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];
  ...
}


0 commentaires