2016-03-18 1 views
1

Mon problème: Obtenir les résultats de requête à partir de 2 tables db avec PROPEL2 même lorsque la seconde table n'a pas d'entrées correspondantes. Si le second a des entrées correspondantes, cela ne pose aucun problème.Propél: Obtenir les résultats de la requête à partir de 2 tables db même si la seconde table n'a pas d'entrées correspondantes

J'ai 3 tables: Entrée, Contingent et Favorit.
Le schéma est le suivant:

Entry.id [PK]
Entry.contingent_id [FK]
Entry.expert_id

Contingent.id [PK]
Contingent.name

Favorit.id [PK]
Favorit.contingent_id [FK]
Favorit.expert_id
Favorit.pos

Je veux obtenir un expert_id spécifié ($ id) toutes les entrées de l'entrée avec le nom-contingent et si existe les favorit.pos pour cet expert et contingent. Je me le voulais avec:

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

Cela ne fonctionne que s'il existe un tel favorit.pos. Dans certains cas, cet élément n'existe pas (ce que l'on attend du système). Dans ces cas, je veux obtenir le résultat aussi juste avec favorit.pos que vide, null ou 0. Mais Propel ne me renvoie pas ces enregistrements.

Avec MySQL Je n'ai aucun problème pour obtenir le résultat souhaité:

SELECT entry.* , 
    (SELECT favorit.position 
    FROM contingent, favorit 
    WHERE 
     favorit.expert_id = entry.expert_id 
     AND entry.contingent_id = contingent.id 
     AND contingent.id = favorit.contingent_id 
    ) 
FROM `entry` 
JOIN contingent 
ON entry.contingent_id = contingent.id 
WHERE 
    entry.expert_id=1; 

Répondre

0

utilisation Inscrivez-vous laissé dans le code:

->join('Contingent.Favorit','selection conditon','left') 

Ce travail gauche lorsque la base de données vide lorsque la condition est fausse en condition comme 'id'=$id