witam,

staram się nauczyć doctrine 2 i mam problem. Otóż stworzyłem taką oto klasę:

  1. <?php
  2.  
  3. namespace Cms\Entity;
  4.  
  5. /**
  6.  * Konfiguracja
  7.  * @Table(name="config")
  8.  * @Entity
  9.  */
  10. class Config extends \Cms\Model\Base
  11. {
  12. /**
  13.   * @var Config
  14.   */
  15. protected static $_instance;
  16.  
  17. /**
  18.   * Identyfikator
  19.   * @var integer $id
  20.   * @Column(name="id", type="integer", nullable="false")
  21.   * @Id
  22.   * @GeneratedValue(strategy="IDENTITY")
  23.   */
  24. private $id;
  25.  
  26. /**
  27.   * Nazwa konfiguracji
  28.   * @Column(type="string", length=255, nullable="false",unique="true")
  29.   * @var string
  30.   */
  31. private $key;
  32.  
  33. /**
  34.   * Wartość
  35.   * @Column(type="string", length=255, nullable="false")
  36.   * @var string
  37.   */
  38. private $value;
  39.  
  40. /**
  41.   * Język, dla którego jest dana opcja
  42.   * @Column(type="string", length=2, nullable="true")
  43.   * @var string
  44.   */
  45. private $lang;
  46.  
  47. /**
  48.   * tablica, gdzie przetrzymuję konfigurację
  49.   * @var array
  50.   */
  51. static protected $_configs;
  52.  
  53.  
  54. /**
  55.   * Inicjalizacja
  56.   */
  57. function init()
  58. {
  59. $request = \Zend_Controller_Front::getInstance()->getRequest();
  60. $lang = $request->getParam('lang', 'pl');
  61.  
  62. $query = $this->_queryBuilder->select('conf')
  63. ->from('\Cms\Entity\Config', 'conf')
  64. ->where('lang = :lang')
  65. ->orWhere('lang IS NULL');
  66.  
  67. $query->setParameter('lang', $lang);
  68. echo $query;
  69. self::$_configs = $query->getQuery()->execute();
  70. }
  71.  
  72. /**
  73.   * Zwracja instancję klasy \Cms\Entity\Config
  74.   * @return Config
  75.   */
  76. static function getInstance()
  77. {
  78. if (!self::$_instance instanceof \Cms\Entity\Config) {
  79. self::$_instance = new \Cms\Entity\Config();
  80. }
  81.  
  82. return self::$_instance;
  83. }
  84.  
  85.  
  86. /**
  87.   *
  88.   * @param string $property
  89.   * @return string
  90.   */
  91. function __get($property) {
  92. return $this->$property;
  93. }
  94.  
  95. /**
  96.   *
  97.   * @param string $property
  98.   * @param string $value
  99.   */
  100. function __set($property, $value) {
  101. $this->$property = $value;
  102. }
  103. }
  104.  


w której chcę trzymać konfigurację pobraną z bazy danych. Problem rodzi się w momencie, gdy chcę wykonać zapytanie:

  1. function init()
  2. {
  3. $request = \Zend_Controller_Front::getInstance()->getRequest();
  4. $lang = $request->getParam('lang', 'pl');
  5.  
  6. $query = $this->_queryBuilder->select('conf')
  7. ->from('\Cms\Entity\Config', 'conf')
  8. ->where('lang = :lang')
  9. ->orWhere('lang IS NULL');
  10.  
  11. $query->setParameter('lang', $lang);
  12. echo $query;
  13. self::$_configs = $query->getQuery()->execute();
  14. }

dostaję wtedy wyrzucony wyjątek:
  1. Fatal error: Uncaught exception 'Doctrine\ORM\Query\QueryException' with message '[Semantical Error] line 0, col 48 near 'lang = :lang)': Error: 'lang' is not defined.' in /var/www/cms/library/Doctrine/ORM/Query/QueryException.php:47
  2. Stack trace:
  3. #0 /var/www/cms/library/Doctrine/ORM/Query/Parser.php(397): Doctrine\ORM\Query\QueryException::semanticalError('line 0, col 48 ...')
  4. #1 /var/www/cms/library/Doctrine/ORM/Query/Parser.php(523): Doctrine\ORM\Query\Parser->semanticalError(''lang' is not d...', Array)
  5. #2 /var/www/cms/library/Doctrine/ORM/Query/Parser.php(211): Doctrine\ORM\Query\Parser->_processDeferredIdentificationVariables()
  6. #3 /var/www/cms/library/Doctrine/ORM/Query/Parser.php(278): Doctrine\ORM\Query\Parser->getAST()
  7. #4 /var/www/cms/library/Doctrine/ORM/Query.php(203): Doctrine\ORM\Query\Parser->parse()
  8. #5 /var/www/cms/library/Doctrine/ORM/Query.php(223): Doctrine\ORM\Query->_parse()
  9. #6 /var/www/cms/library/Doctrine/ORM/AbstractQuery.php(519): Doctrine\ORM\Query->_doExecute()
  10. #7 /var/www/cms/library/Cms/Entity/C in /var/www/cms/library/Zend/Controller/Plugin/Broker.php on line 336

zapytanie, które buduję to:
  1. SELECT conf FROM \Cms\Entity\Config conf WHERE (lang = :lang) OR (lang IS NULL)


no i nie mogę doszukać się błędu.. Mógłbym prosić o pomoc?

problem rozwiązałem, wystarczyło, abym napisał:
  1. $query = $this->_queryBuilder->select('conf')
  2. ->from('\Cms\Entity\Config', 'conf')
  3. ->where('conf.lang = :lang')
  4. ->orWhere('conf.lang IS NULL');


jednak mam nadal problem, leczy przy dodawaniu nowych wartości do bazy danych. Robię to tak:

  1. $config = new Config();
  2. $config->key = $key;
  3. $config->value = $value;
  4. $this->_entityManager->persist($config);
  5. $this->_entityManager->flush();


i w tym miejscu dostaję wyjatek:
Cytat
Message: 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 'key, value) VALUES ('test', 'test')' at line 1
Stack trace:

#0 /var/www/cms/library/Doctrine/DBAL/Statement.php(131): PDOStatement->execute(NULL)
#1 /var/www/cms/library/Doctrine/ORM/Persisters/BasicEntityPersister.php(216): Doctrine\DBAL\Statement->execute()
#2 /var/www/cms/library/Doctrine/ORM/UnitOfWork.php(697): Doctrine\ORM\Persisters\BasicEntityPersister->executeInserts()
#3 /var/www/cms/library/Doctrine/ORM/UnitOfWork.php(280): Doctrine\ORM\UnitOfWork->executeInserts(Object(Doctrine\ORM\Mapping\ClassMetadata))
#4 /var/www/cms/library/Doctrine/ORM/EntityManager.php(324): Doctrine\ORM\UnitOfWork->commit()
#5 /var/www/cms/library/Cms/Entity/Config.php(116): Doctrine\ORM\EntityManager->flush()
#6 /var/www/cms/application/frontend/modules/default/controllers/IndexController.php(8): Cms\Entity\Config->set('test', 'test')
#7 /var/www/cms/library/Zend/Controller/Action.php(516): IndexController->indexAction()
#8 /var/www/cms/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('indexAction')
#9 /var/www/cms/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#10 /var/www/cms/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#11 /var/www/cms/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#12 /var/www/cms/public/index.php(48): Zend_Application->run()
#13 {main}


i nie mam pomysłu gdzie robię błąd smile.gif