Проблема с двумя запросами Doctrine - PullRequest
0 голосов
/ 30 июня 2010

Здравствуйте, у меня есть небольшая проблема с запросами: в действии 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

EDIT

Спасибо за этот ответ,

Но когда я хочу поместить запросы в мою модель, у меня возникают другие проблемы: у меня есть ошибка с $ 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 )

Редактировать: У меня все еще есть проблема. Когда у второго запроса есть что вернуть, первый не возвращает все записи

1 Ответ

1 голос
/ 30 июня 2010

В качестве хорошей практики 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();
...