2010-06-30 114 views
0

你好,我有要求一个小问题:在动作executeFiche,我有三个要求问题有两个原则要求

public function executeFiche(sfWebRequest $request){ 

    // Récupération du logement correspondant à l'ID passé dans l'URL 
    $this->forward404Unless($this->logement = Doctrine::getTable('Logement')->find(array($request->getParameter('id'))), sprintf('Object logement does not exist (%s).', $request->getParameter('id'))); 

    // Récupération du (ou des) locataire(s) actuel(s) du logement 
    $locataires = Doctrine::getTable('Logement')->createQuery('l') 
    ->leftJoin('l.Bail b') 
    ->leftJoin('b.Locataire') 
    ->where('l.id = ?', $request->getParameter('id')) 
    ->andWhere('(b.datefin >= ?', date('Y-m-d', time())) 
    ->orWhere('b.datefin = 0000-00-00)') 
    ->execute(); 

// Récupération du (ou des) locataire(s) précédent(s) du logement 
$locatairesprec = Doctrine::getTable('Logement')->createQuery('l') 
    ->leftJoin('l.Bail b') 
    ->leftJoin('b.Locataire') 
    ->where('l.id = ?', $request->getParameter('id')) 
    ->andWhere('b.datefin < ?', date('Y-m-d', time())) 
    ->andWhere('b.datefin != 0000-00-00') 
    ->orderBy('datedeb') 
    ->execute(); 

$this->locataires = $locataires; 
$this->locatairesprec = $locatairesprec; 
    } 

问题是我的两个请求(第一次是正常的)阻碍自己和结果返回是错误的。

编辑: SQL请求

SELECT l.id AS l__id, l.adresse AS l__adresse, l.montee AS l__montee, l.etage AS 
l__etage, l.numetage AS l__numetage, l.numlogt AS l__numlogt, l.taille AS l__taille, 
l.surfacehab AS l__surfacehab, l.typelog AS l__typelog, l.intergen AS l__intergen, 
l.ascenseur AS l__ascenseur, l.ascenseuracc AS l__ascenseuracc, l.accessibl AS 
l__accessibl, l.adaptable AS l__adaptable, l.adapte AS l__adapte, l.chauffage AS 
l__chauffage, l.chargeschauf AS l__chargeschauf, l.chargeseauch AS l__chargeseauch, 
l.chargeseaufr AS l__chargeseaufr, l.reservataire AS l__reservataire, l.loyer AS 
l__loyer, l.loyercc AS l__loyercc, l.commentaires AS l__commentaires, l.created_at AS 
l__created_at, l.updated_at AS l__updated_at, b.id AS b__id, b.locataire AS b__locataire, 
b.logement AS b__logement, b.datedeb AS b__datedeb, b.datefin AS b__datefin, b.colloc AS 
b__colloc, b.bailglissant AS b__bailglissant, l2.nud AS l2__nud, l2.titre AS l2__titre, 
l2.nom AS l2__nom, l2.prenom AS l2__prenom, l2.nationalite AS l2__nationalite, 
l2.datenaissance AS l2__datenaissance, l2.statutmatri AS l2__statutmatri, l2.statutpro AS 
l2__statutpro, l2.nbenfants AS l2__nbenfants, l2.monoparental AS l2__monoparental, 
l2.numprec AS l2__numprec, l2.rueprec AS l2__rueprec, l2.quartierprec AS l2__quartierprec, 
l2.codepostalprec AS l2__codepostalprec, l2.villeprec AS l2__villeprec, l2.statutlogprec 
AS l2__statutlogprec FROM logement l LEFT JOIN bail b ON l.id = b.logement LEFT JOIN 
locataire l2 ON b.locataire = l2.nud WHERE (l.id = '1' AND (b.datefin >= '2010-07-01' OR 
b.datefin = '0000-00-00')) 

    0.03s, "doctrine" connection 
    # 

    SELECT l.id AS l__id, l.adresse AS l__adresse, l.montee AS l__montee, l.etage AS 
l__etage, l.numetage AS l__numetage, l.numlogt AS l__numlogt, l.taille AS l__taille, 
l.surfacehab AS l__surfacehab, l.typelog AS l__typelog, l.intergen AS l__intergen, 
l.ascenseur AS l__ascenseur, l.ascenseuracc AS l__ascenseuracc, l.accessibl AS 
l__accessibl, l.adaptable AS l__adaptable, l.adapte AS l__adapte, l.chauffage AS 
l__chauffage, l.chargeschauf AS l__chargeschauf, l.chargeseauch AS l__chargeseauch, 
l.chargeseaufr AS l__chargeseaufr, l.reservataire AS l__reservataire, l.loyer AS l__loyer, 
l.loyercc AS l__loyercc, l.commentaires AS l__commentaires, l.created_at AS l__created_at, l.updated_at AS l__updated_at, b.id AS b__id, b.locataire AS b__locataire, 
b.logement AS b__logement, b.datedeb AS b__datedeb, b.datefin AS b__datefin, b.colloc AS 
b__colloc, b.bailglissant AS b__bailglissant, l2.nud AS l2__nud, l2.titre AS l2__titre, 
l2.nom AS l2__nom, l2.prenom AS l2__prenom, l2.nationalite AS l2__nationalite, 
l2.datenaissance AS l2__datenaissance, l2.statutmatri AS l2__statutmatri, l2.statutpro AS 
l2__statutpro, l2.nbenfants AS l2__nbenfants, l2.monoparental AS l2__monoparental, 
l2.numprec AS l2__numprec, l2.rueprec AS l2__rueprec, l2.quartierprec AS l2__quartierprec, 
l2.codepostalprec AS l2__codepostalprec, l2.villeprec AS l2__villeprec, l2.statutlogprec 
AS l2__statutlogprec FROM logement l LEFT JOIN bail b ON l.id = b.logement LEFT JOIN 
locataire l2 ON b.locataire = l2.nud WHERE (l.id = '1' AND b.datefin < '2010-07-01' AND 
b.datefin != '0000-00-00') ORDER BY datedeb 

编辑

感谢这个答案,

但是,当我想提出的疑问在我的模型,我也有其它的问题:我有一个错误,'$ request-> getParameter('id')'。我将它交换到'$ this-> getId()'和Doctrine告诉我我有一个错误。

对于括号,我在下一个关闭他们。我不知道另一种生成SQL的顺序在哪里。它是有:

WHERE l.id = $request->getParameter('id') AND (b.datefin >= date('Y-m-d', time()) OR b.datefin = 0000-00-00) 

编辑:我仍然有我的问题。当第二个请求返回时,第一个不返回所有条目

+0

你得到什么结果,什么是预期的结果。另外一个示例模式可能有一些帮助 – johnwards 2010-06-30 11:02:42

+0

例如,当我删除第二个请求时,第一个请求返回我的数据库的2个结果,但是如果第二个请求返回结果,则第一个请求不会返回它所需的所有条目。 – Elorfin 2010-06-30 13:26:33

+0

我已经更新了我的答案,虽然我不确定,但您可以试试。 – 2010-07-01 16:11:14

回答

1

作为一个很好的symfony实践,您可以先将查询放入模型中(类似LogementTable.class.php)。

您在查询中也有一些语法问题。


更新:我没有注意到括号后

上线收盘在以下行中,你打开的括号,但它不是关闭后:

->andWhere('(b.datefin >= ?', date('Y-m-d', time())) 

第二个错误,在SQL日期中必须用引号括起来:

->orWhere("b.datefin = '0000-00-00')") 
// ... 
->andWhere("b.datefin != '0000-00-00'") 

更新2:

尝试这是你的第二个要求:

$locatairesprec = Doctrine::getTable('Logement')->createQuery('l') 
    ->leftJoin('l.Bail b') 
    ->leftJoin('b.Locataire') 
    ->where('l.id = ?', $request->getParameter('id')) 
    ->andWhere('(b.datefin < ?', date('Y-m-d', time())) 
    ->andWhere("b.datefin != '0000-00-00')") 
    ->orderBy('datedeb') 
    ->execute();