我成功地在Symfony 2.8中使用PHP 5.6的應用程序。在升級到PHP 7.0.20之後,我遇到了使用一對多關係綁定/提交複雜表單的問題。PHP從5.6.30升級到7.0.20後Symfony 2.8上覆雜表單的SQL問題
所得錯誤是:
request.CRITICAL: Uncaught PHP Exception Doctrine\ORM\Query\QueryException: "[Syntax Error] line 0, col 63: Error: Expected Literal, got 'ORDER'" at ..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php line 44 {"exception":"[object] (Doctrine\ORM\Query\QueryException(code: 0): [Syntax Error] line 0, col 63: Error: Expected Literal, got 'ORDER' at ..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:44, Doctrine\ORM\Query\QueryException(code: 0): SELECT s1 FROM Prfuk\WebquotaBundle\Entity\Workplace s1 WHERE ORDER BY s1.nazev ASC at ..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:39)"} []
有WHERE
和ORDER BY
之間的缺失部分。奇怪的是,列表數據是好的,填寫表單域來編輯記錄也是好的,問題是隻有當POST
請求與當前表單數據合併時,我認爲SQL
的缺失部分是由原則生成的。
與其他表格無關的簡單形式正常工作。
我是最新的2.8.x Symfony版本,我能夠通過作曲家更新的最新教義是2.3.6-dev,這是相當古老的,但它似乎是最新的支持/兼容。
這是一個已知的問題嗎? Symfony 2.8是否與PHP 7.0兼容? 你可以給我一些建議如何解決這個問題嗎?
我的頁面類型:
$qb = array(
'class' => 'Prfuk\\WebquotaBundle\\Entity\\Workplace',
'property' => 'nazev',
'query_builder' => function(\Prfuk\WebquotaBundle\Entity\WorkplaceRepository $repository) {
return $repository
->createQueryBuilder('s1')
->add('orderBy', 's1.nazev ASC');
},
'attr' => array(
"class" => "input_text_nazev"),
'label' => "Pracoviště",
);
$builder->add('pracoviste', 'entity', $qb);
我的控制器:
$form = $this->createForm(new FolderType($this->getDoctrine()->getEntityManager()), $folder);
if ($request->isMethod('POST')) {
//print_r($form->getData()); // works here
$form->bind($request); // throws an exception
ORM:
Prfuk\WebquotaBundle\Entity\Folder:
type: entity
table: null
repositoryClass: Prfuk\WebquotaBundle\Entity\FolderRepository
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
nazev:
type: string
length: '255'
cesta:
type: string
length: '255'
kvota:
type: integer
uzivatel:
type: string
length: '255'
poznamka:
type: text
vyuziti_mb:
type: integer
options:
default: 0
manyToOne:
pracoviste:
targetEntity: Workplace
inversedBy: pracoviste
joinColumn:
name: pracoviste
referencedColumnName: id
db:
targetEntity: DatabaseInfo
inversedBy: db
joinColumn:
name: db
referencedColumnName: id
skupina:
targetEntity: GroupInfo
inversedBy: skupina
joinColumn:
name: skupina
referencedColumnName: id
webhost:
targetEntity: WebhostInfo
inversedBy: webhost
joinColumn:
name: webhost
referencedColumnName: id
lifecycleCallbacks: { }
編輯:堆棧跟蹤(刪節文件路徑):
[1] Doctrine\ORM\Query\QueryException: [Syntax Error] line 0, col 63: Error: Expected Literal, got 'ORDER'
at n/a
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php line 44
at Doctrine\ORM\Query\QueryException::syntaxError('line 0, col 63: Error: Expected Literal, got 'ORDER'', object(QueryException))
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 396
at Doctrine\ORM\Query\Parser->syntaxError('Literal')
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2363
at Doctrine\ORM\Query\Parser->Literal()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2550
at Doctrine\ORM\Query\Parser->ArithmeticPrimary()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2485
at Doctrine\ORM\Query\Parser->ArithmeticFactor()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2453
at Doctrine\ORM\Query\Parser->ArithmeticTerm()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2427
at Doctrine\ORM\Query\Parser->SimpleArithmeticExpression()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2414
at Doctrine\ORM\Query\Parser->ArithmeticExpression()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2749
at Doctrine\ORM\Query\Parser->ComparisonExpression()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2277
at Doctrine\ORM\Query\Parser->SimpleConditionalExpression()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2177
at Doctrine\ORM\Query\Parser->ConditionalPrimary()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2153
at Doctrine\ORM\Query\Parser->ConditionalFactor()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2121
at Doctrine\ORM\Query\Parser->ConditionalTerm()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2096
at Doctrine\ORM\Query\Parser->ConditionalExpression()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 1209
at Doctrine\ORM\Query\Parser->WhereClause()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 759
at Doctrine\ORM\Query\Parser->SelectStatement()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 726
at Doctrine\ORM\Query\Parser->QueryLanguage()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 229
at Doctrine\ORM\Query\Parser->getAST()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 304
at Doctrine\ORM\Query\Parser->parse()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query.php line 233
at Doctrine\ORM\Query->_parse()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query.php line 245
at Doctrine\ORM\Query->_doExecute()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php line 753
at Doctrine\ORM\AbstractQuery->execute(null, '1')
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php line 542
at Doctrine\ORM\AbstractQuery->getResult()
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php line 126
at Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader->getEntitiesByIds('id', array('27'))
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Form/ChoiceList/DoctrineChoiceLoader.php line 153
at Symfony\Bridge\Doctrine\Form\ChoiceList\DoctrineChoiceLoader->loadChoicesForValues(array('27'), array(object(IdReader), 'getIdValue'))
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/ChoiceList/LazyChoiceList.php line 122
at Symfony\Component\Form\ChoiceList\LazyChoiceList->getChoicesForValues(array('27'))
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.php line 46
at Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToValueTransformer->reverseTransform('27')
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 1190
at Symfony\Component\Form\Form->viewToNorm('27')
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 639
at Symfony\Component\Form\Form->submit('27', true)
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 579
at Symfony\Component\Form\Form->submit(array('pracoviste' => '27', 'cesta' => 'simonju_botazah', 'kvota' => '100', 'uzivatel' => 'simonju', 'skupina' => '', 'poznamka' => 'fake záznam pro člena skupiny www-botazah', 'db' => '', 'webhost' => '', 'vyuziti_mb' => '0'))
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 692
at Symfony\Component\Form\Form->bind(object(Request))
in /..../Symfony/src/Prfuk/WebquotaBundle/Controller/FolderController.php line 90
at Prfuk\WebquotaBundle\Controller\FolderController->editAction(object(Request), '650')
in line
at call_user_func_array(array(object(FolderController), 'editAction'), array(object(Request), '650'))
in /..../Symfony/app/bootstrap.php.cache line 3247
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), '1')
in /..../Symfony/app/bootstrap.php.cache line 3206
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), '1', true)
in /..../Symfony/app/bootstrap.php.cache line 3360
at Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel->handle(object(Request), '1', true)
in /..../Symfony/app/bootstrap.php.cache line 2562
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
in /..../Symfony/web/app_dev.php line 28
[2] Doctrine\ORM\Query\QueryException: SELECT s1 FROM Prfuk\WebquotaBundle\Entity\Workplace s1 WHERE ORDER BY s1.nazev ASC
at n/a
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php line 39
at Doctrine\ORM\Query\QueryException::dqlError('SELECT s1 FROM Prfuk\WebquotaBundle\Entity\Workplace s1 WHERE ORDER BY s1.nazev ASC')
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 396
at Doctrine\ORM\Query\Parser->syntaxError('Literal')
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2363
at Doctrine\ORM\Query\Parser->Literal()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2550
at Doctrine\ORM\Query\Parser->ArithmeticPrimary()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2485
at Doctrine\ORM\Query\Parser->ArithmeticFactor()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2453
at Doctrine\ORM\Query\Parser->ArithmeticTerm()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2427
at Doctrine\ORM\Query\Parser->SimpleArithmeticExpression()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2414
at Doctrine\ORM\Query\Parser->ArithmeticExpression()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2749
at Doctrine\ORM\Query\Parser->ComparisonExpression()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2277
at Doctrine\ORM\Query\Parser->SimpleConditionalExpression()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2177
at Doctrine\ORM\Query\Parser->ConditionalPrimary()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2153
at Doctrine\ORM\Query\Parser->ConditionalFactor()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2121
at Doctrine\ORM\Query\Parser->ConditionalTerm()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 2096
at Doctrine\ORM\Query\Parser->ConditionalExpression()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 1209
at Doctrine\ORM\Query\Parser->WhereClause()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 759
at Doctrine\ORM\Query\Parser->SelectStatement()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 726
at Doctrine\ORM\Query\Parser->QueryLanguage()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 229
at Doctrine\ORM\Query\Parser->getAST()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php line 304
at Doctrine\ORM\Query\Parser->parse()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query.php line 233
at Doctrine\ORM\Query->_parse()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query.php line 245
at Doctrine\ORM\Query->_doExecute()
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php line 753
at Doctrine\ORM\AbstractQuery->execute(null, '1')
in /..../Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php line 542
at Doctrine\ORM\AbstractQuery->getResult()
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php line 126
at Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader->getEntitiesByIds('id', array('27'))
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Form/ChoiceList/DoctrineChoiceLoader.php line 153
at Symfony\Bridge\Doctrine\Form\ChoiceList\DoctrineChoiceLoader->loadChoicesForValues(array('27'), array(object(IdReader), 'getIdValue'))
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/ChoiceList/LazyChoiceList.php line 122
at Symfony\Component\Form\ChoiceList\LazyChoiceList->getChoicesForValues(array('27'))
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.php line 46
at Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToValueTransformer->reverseTransform('27')
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 1190
at Symfony\Component\Form\Form->viewToNorm('27')
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 639
at Symfony\Component\Form\Form->submit('27', true)
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 579
at Symfony\Component\Form\Form->submit(array('pracoviste' => '27', 'cesta' => 'simonju_botazah', 'kvota' => '100', 'uzivatel' => 'simonju', 'skupina' => '', 'poznamka' => 'fake záznam pro člena skupiny www-botazah', 'db' => '', 'webhost' => '', 'vyuziti_mb' => '0'))
in /..../Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 692
at Symfony\Component\Form\Form->bind(object(Request))
in /..../Symfony/src/Prfuk/WebquotaBundle/Controller/FolderController.php line 90
at Prfuk\WebquotaBundle\Controller\FolderController->editAction(object(Request), '650')
in line
at call_user_func_array(array(object(FolderController), 'editAction'), array(object(Request), '650'))
in /..../Symfony/app/bootstrap.php.cache line 3247
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), '1')
in /..../Symfony/app/bootstrap.php.cache line 3206
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), '1', true)
in /..../Symfony/app/bootstrap.php.cache line 3360
at Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel->handle(object(Request), '1', true)
in /..../Symfony/app/bootstrap.php.cache line 2562
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
in /..../Symfony/web/app_dev.php line 28
你確定你有2.8,因爲Form :: bind在2.3中被折舊了。教義應該是2.5。我懷疑你的應用程序比你想象的要老得多。 – Cerad
是的,它是2.8.22。該方法已被棄用,但直到3.0它在那裏。我也嘗試使用submit()和handleRequest(),兩者都給了我相同的結果。 –
我沒有弄清楚如何改變composer.json以獲得更近的教義。 2.4和2.5只是在依賴性檢查中給出錯誤。 –