2015-11-13 1 views
0

Je souhaite ajouter une colonne SQL d'une autre table à ma requête Propel mais je ne peux pas l'obtenir avec le normal "-> withColumn" Déclaration. La deuxième table n'est pas connectée avec la première par une clé étrangère, mais elle a pour chaque entrée dans la première exactement une entrée dans la seconde. La connexion entre les deux tables sont deux identifiants de deux autres tables.
Pour mieux comprendre, voici mes tableaux:

entrée :Propel ORM: Ajouter une colonne d'une autre table qui n'est pas connectée avec une clé étrangère directe

  • id
  • Nom
  • expert_id
  • contingent_id

Favorit:

  • id
  • Position
  • expert_id
  • contingent_id
expert

et contingent:

  • id
  • ...

Je veux que tous entri es de la table d'entrée avec une position de colonne supplémentaire. Il existe pour chaque entrée une faveur. Avec cette requête SQL est pas un problème:

SELECT *, (SELECT position FROM favorit AS f WHERE e.expert_id = f.expert_id AND e.contingent_id = f.contingent_id) AS position FROM entry AS e

Mais je ne savez pas comment comment créer la requête avec Propel. Je l'ai essayé avec ceci:

EntryQuery::create() ->filterByExpertId(1) ->withColumn("select position from favorit AS f where e.expert_id = f.expert_id and e.contingent_id = f.contingent_id", '_favorit_id', 'type: int') ->find();

Mais Propel me donne une erreur

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select position from favorit AS f where e.expert_id = f.expert_id and e.continge' at line 1' in D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\Adapter\Pdo\PdoStatement.php:57 Stack trace: #0 D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\Adapter\Pdo\PdoStatement.php(57): PDOStatement->execute(NULL) #1 D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\Connection\StatementWrapper.php(194): Propel\Runtime\Adapter\Pdo\PdoStatement->execute(NULL) #2 D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\ActiveQuery\Criteria.php(2633): Propel\Runtime\Connection\StatementWrapper->execute() #3 D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\ActiveQuery in D:\Entwicklung\htdocs\zeiterfassung\vendor\propel\propel\src\Propel\Runtime\ActiveQuery\Criteria.php on line 2639

Je n'ai pas de problème pour ajouter une colonne d'une autre table quand il existe dans la table d'entrée d'une clé étrangère à l'autre table comme contingent_id ou avec des colonnes calculées:
EntryQuery::create() ->filterByExpertId(1) ->join('Entry.Contingent') ->withColumn('Contingent.name','_contingentName') ->withColumn("LEFT(TIMEDIFF(TIMEDIFF( timeEnd , timeBegin ), pause ),5)", '_duration', 'type: time') ->find();

Répondre

0

J'ai trouvé une solution pour mon problème:

$result = EntryQuery::create() ->filterByExpertId($id) ->join('Entry.Contingent') ->join('Contingent.Favorit') ->where('Favorit.expert_id = ?', $id) ->withColumn('Favorit.position','_position') ->find();

Avec cela, je suis la bonne réponse. Mais j'ai une autre question:

S'il existe à une entrée un expert correspondant et un contingent mais pas de favorit, donc cette entrée ne sera pas affichée avec ma requête actuelle. Je veux en plus dans ces cas aussi cette entrée mais avec une position avec une valeur par défaut comme null ou 0 (zéro).