Запрос на продвижение Symfony

#symfony1 #propel

#symfony1 #продвигать

Вопрос:

Я хочу выполнить этот запрос в Symfony / Propel

 SELECT 
folders.NAME,
COUNT(documents.NAME),
COUNT(files.idfiles),
SUM(files.size)

FROM  `folders`
LEFT JOIN `documents_has_folders` ON (documents_has_folders.folders_idfolders = folders.idfolders)
LEFT JOIN documents ON (documents_has_folders.DOCUMENTS_IDDOCUMENTS=documents.IDDOCUMENTS) 
LEFT JOIN files ON (documents.IDDOCUMENTS=files.DOCUMENTS_IDDOCUMENTS) 

GROUP BY folders.idfolders
  

Я выполняю этот запрос

 $x = FoldersQuery::create()
            ->addSelectColumn(FoldersPeer::NAME)
            ->addSelectColumn("COUNT(".DocumentsPeer::IDDOCUMENTS.")")
            ->addSelectColumn("COUNT(".FilesPeer::IDFILES.")")
            ->addSelectColumn("SUM(".FilesPeer::SIZE.")")
            ->addJoin(DocumentsHasFoldersPeer::FOLDERS_IDFOLDERS, FoldersPeer::IDFOLDERS, CRITERIA::LEFT_JOIN)
            ->addJoin(DocumentsHasFoldersPeer::DOCUMENTS_IDDOCUMENTS, DocumentsPeer::IDDOCUMENTS, CRITERIA::LEFT_JOIN)
            ->addJoin(DocumentsPeer::IDDOCUMENTS, FilesPeer::DOCUMENTS_IDDOCUMENTS, CRITERIA::LEFT_JOIN)
            ->addGroupByColumn(FoldersPeer::IDFOLDERS)
            ->find();
  

Это возвращает:

 500 | Internal Server Error | PropelException
Unable to execute SELECT statement [SELECT folders.NAME, COUNT(documents.IDDOCUMENTS), COUNT(files.IDFILES), SUM(files.SIZE) FROM LEFT JOIN folders ON (documents_has_folders.FOLDERS_IDFOLDERS=folders.IDFOLDERS) LEFT JOIN documents ON (documents_has_folders.DOCUMENTS_IDDOCUMENTS=documents.IDDOCUMENTS) LEFT JOIN files ON (documents.IDDOCUMENTS=files.DOCUMENTS_IDDOCUMENTS) WHERE folders.REMOVE_DATE IS NULL GROUP BY folders.IDFOLDERS] [wrapped: 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 'LEFT JOIN folders ON (documents_has_folders.FOLDERS_IDFOLDERS=folders.IDFOLDERS)' at line 1]
  

Почему в FROM нет таблицы??? Почему он создает неправильный запрос?

Большое спасибо.

ОТРЕДАКТИРОВАНО:

Та же проблема, и если я выполняю запрос следующим образом:

 $c = new Criteria();
    $c->addSelectColumn(FoldersPeer::NAME);
    $c->addSelectColumn("COUNT(".DocumentsPeer::IDDOCUMENTS.")");
    $c->addSelectColumn("COUNT(".FilesPeer::IDFILES.")");
    $c->addSelectColumn("SUM(".FilesPeer::SIZE.")");

    $c->addJoin(DocumentsHasFoldersPeer::FOLDERS_IDFOLDERS, FoldersPeer::IDFOLDERS, CRITERIA::LEFT_JOIN);
    $c->addJoin(DocumentsHasFoldersPeer::DOCUMENTS_IDDOCUMENTS, DocumentsPeer::IDDOCUMENTS, CRITERIA::LEFT_JOIN);
    $c->addJoin(DocumentsPeer::IDDOCUMENTS, FilesPeer::DOCUMENTS_IDDOCUMENTS, CRITERIA::LEFT_JOIN);

    $c->addGroupByColumn(FoldersPeer::IDFOLDERS);
  

Снова после FROM нет таблицы…

 Unable to execute SELECT statement [SELECT folders.NAME, COUNT(documents.IDDOCUMENTS), COUNT(files.IDFILES), SUM(files.SIZE) FROM LEFT JOIN folders ON (documents_has_folders.FOLDERS_IDFOLDERS=folders.IDFOLDERS AND folders.remove_date IS NULL ) LEFT JOIN documents ON (documents_has_folders.DOCUMENTS_IDDOCUMENTS=documents.IDDOCUMENTS AND documents.remove_date IS NULL ) LEFT JOIN files ON (documents.IDDOCUMENTS=files.DOCUMENTS_IDDOCUMENTS AND documents.remove_date IS NULL AND files.remove_date IS NULL ) WHERE folders.remove_date IS NULL AND documents.remove_date IS NULL AND files.remove_date IS NULL GROUP BY folders.IDFOLDERS] [wrapped: 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 'LEFT JOIN folders ON (documents_has_folders.FOLDERS_IDFOLDERS=folders.IDFOLDERS ' at line 1]
  

Комментарии:

1. Является ли поле предложения FROM пустым, если вы выполняете очень простой запрос, такой как $x = FoldersQuery::create()->limit(10)->find(); ?

2. он возвращает правильные данные, и запрос выполняется правильно, если я выполняю $ x = FoldersQuery::create()->limit(10)-> find();

Ответ №1:

Это не способ Propel создавать запросы со времен Propel 1.6 (возможно, раньше). Мы не используем критерии или одноранговые классы. Следующий запрос:

 SELECT 
folders.NAME,
COUNT(documents.NAME),
COUNT(files.idfiles),
SUM(files.size)

FROM  `folders`
LEFT JOIN `documents_has_folders` ON (documents_has_folders.folders_idfolders = folders.idfolders)
LEFT JOIN documents ON (documents_has_folders.DOCUMENTS_IDDOCUMENTS=documents.IDDOCUMENTS) 
LEFT JOIN files ON (documents.IDDOCUMENTS=files.DOCUMENTS_IDDOCUMENTS) 
  

Может быть написано так:

 $query = FoldersQuery::create())
    ->joinDocuments('documents')
    ->joinFiles('files')
    ->withColumn('COUNT(documents.NAME)', 'CountName')
    ->withColumn('COUNT(files.IDFILES)', 'CountIdFiles')
    ->withColumn('SUM(files.size)', 'Sum')
    ->select(array('Name', 'CountName', 'CountIdFiles', 'Sum'))
    ;
  

Возможно, потребуется внести коррективы, но это правильный способ.

Комментарии:

1. Запрос, который вы мне даете, не работает … у меня есть manytomany realtionship из таблицы 1 в таблицу 2 и из таблицы 2 в таблицу 3 от 1 до многих. как объединить все эти 4 таблицы?

2. @user783029 — «не работает» недостаточно, чтобы описать, с какой проблемой вы столкнулись. Как говорит Уильям, это может потребовать корректировок — для процесса обучения будет лучше, если вы попытаетесь их внести. Если это не сработает, сообщите нам, какие ошибки вы получаете, или в чем разница между ожиданием и выводом 🙂

3. возможно ли достичь функциональности, НЕ используя новый способ создания запросов в Porpel 1.6? У меня массовая загрузка старого кода с использованием запросов старого типа критериев, честно говоря, некоторые из них работают, некоторые из них нет. Бьюсь об заклад, это своего рода ошибка в кодовой базе.