Doctrine2.1: recherche par DiscriminatorColumn résultats en “terrain Inconnu” exception
J'ai essayé de rechercher cette erreur, mais le fait que je n'ai rien trouvé qui m'amène à croire que je suis en train de faire quelque chose de stupide. Je vais inclure le code ci-dessous, mais, fondamentalement, je suis à l'aide de plusieurs héritage de table (ou La Classe De L'Héritage De Table) et l'utilisation de l'ORM Doctrine findBy() la méthode de requête sur la base de la colonne discriminante, qui résultats dans la suite de ORMException être jeté: "non reconnu champ: type".
Voici le code qui déclenche l'exception:
//$this->em is an instance of \Doctrine\ORM\EntityManager
$repository = $this->em->getRepository('JoeCommentBundle:Thread');
return $repository->findOneBy(array(
'type' => $this->type,
'related_id' => $id
));
Voici le code approprié pour la "base" entité abstraite:
<?php
namespace Joe\Bundle\CommentBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
* @ORM\Table(name="comment_threads")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap( {"story" = "Joe\Bundle\StoryBundle\Entity\StoryThread"} )
*/
abstract class Thread
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(name="related_id", type="integer")
*/
protected $relatedId;
/** MORE FIELDS BELOW.... **/
Et enfin, voici le code pour le béton fil de l'entité:
<?php
namespace Joe\Bundle\StoryBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Joe\Bundle\CommentBundle\Entity\Thread as AbstractThread;
/**
* @ORM\Entity
* @ORM\Table(name="story_comment_threads")
*/
class StoryThread extends AbstractThread
{
/**
* @ORM\OneToOne(targetEntity="Story")
* @ORM\JoinColumn(name="story_id", referencedColumnName="id")
*/
protected $story;
}
J'ai vérifié mon schéma, et le type
colonne certainement existe, donc je ne suis pas sûr de ce que pourrait en être la cause. Des idées? Merci.
Merci pour la réponse de Lee, mais de le changer pour "thread_type" n'a fait aucune différence. Heureusement, cela m'a forcé à fixer mon local xdebug et maintenant je peux voir qu'il y a une case dans "la Doctrine\ORM\objets persistants\BasicEntityPersister", sur la ligne 1205 comme suit: "if (isset($this->_class->columnNames[$champ]))". Le $this->_class->columnNames tableau ne contient pas discriminatoire de la colonne (en tant que "type" ou "thread_type') MAIS il y a un $this->_class->discriminatorColumn tableau qui contient les détails, que je suis après. Est-ce un bug, la Doctrine n'est-ce pas?
J'ai fait un peu plus de creuser et a constaté le problème suivant rapport de presque 2 ans: http://www.doctrine-project.org/jira/browse/DDC-707 Il a été marqué comme un double d'un bug résolu, mais je pense que le problème réel n'a été négligé.
OriginalL'auteur RobMasters | 2012-05-11
Vous devez vous connecter pour publier un commentaire.
Rob, lors de l'interrogation de votre utilisation de l'entité mère et tente de filtre sur le régulateur de la valeur. Au lieu de cela, le travail sur le référentiel par rapport à l'enfant entité que vous souhaitez récupérer. La Doctrine fera le reste pour vous. Donc dans votre cas, vous voulez obtenir le référentiel pour StoryThread.
Cela fonctionne également dans symfony 2.8? réponse vide pour moi
OriginalL'auteur Lee Davis
Vous ne pouvez pas utiliser le régulateur de colonne comme une entité standard de la propriété.
Au lieu de cela, vous pouvez faire ce qui suit:
Parfois, il n'est pas suffisant. Par exemple, si vous devez choisir 2 des 3 types d'entité ou même de la commande par le type.
Pour info: Vous pouvez sélectionner plusieurs types à l'aide de
INSTANCE OF (:type1, :type2, ...)
de sorte que vous n'avez pas à concaténer plusieursINSTANCE OF
appels de fonction pour chaque catégorie que vous souhaitez inclure dans le résultat.N'a pu trouver aucune référence pour cette fonction dans la documentation. Pouvez-vous?
Voir: La première Doctrine2 fonction de la demande qui a abouti à
INSTANCE OF
(Doctrine Système de Suivi de Problème)OriginalL'auteur Gedrox