2011-01-29 3 views
1

誰も私の前の質問に答えなかったので、私はドクトリンサンドボックス自体の問題を再現することにしました。 。 (作業と非稼働のための)./doctrine orm:run-dqlを使ってサンドボックスを操作する

マイディレクトリ

|-- library 
| |-- Doctrine 
| | |-- Common 
| | |-- DBAL 
| | |-- ORM 
| | `-- Symfony 
| `-- MyApp 
|  |-- Entities 
|  | |-- Address.php 
|  | `-- User.php 
|  `-- Proxies 
`-- tools 
    `-- sandbox 
     |-- cli-config.php 
     |-- database.sqlite 
     |-- doctrine 
     |-- doctrine.php 
     |-- index.php 
     |-- xml 
     | |-- Entities.Address.dcm.xml 
     | `-- Entities.User.dcm.xml 
     `-- yaml 
      |-- Entities.Address.dcm.yml 
      `-- Entities.User.dcm.yml 

ワーキングサンドボックス

$ ./doctrine orm:run-dql "SELECT a FROM Entities\Address a" 
array(0) { 
} 

非ワーキングサンドボックス

$ ./doctrine orm:run-dql "SELECT a FROM Entities\Address a" 

Fatal error: Cannot redeclare class Entities\MyApp_Entities_Address in /Users/foo/Lab/doctrine/test/library/MyApp/Entities/Address.php on line 7 
それらの両方が同じ cli-config.phpdoctrine.phpを使用している

cli-config.php

<?php 

require_once '../../library/Doctrine/Common/ClassLoader.php'; 

$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\ORM', realpath(__DIR__ . '/../../library')); 
$classLoader->register(); 
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\DBAL', realpath(__DIR__ . '/../../library')); 
$classLoader->register(); 
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\Common', realpath(__DIR__ . '/../../library')); 
$classLoader->register(); 
$classLoader = new \Doctrine\Common\ClassLoader('Symfony', realpath(__DIR__ . '/../../library/Doctrine')); 
$classLoader->register(); 
$classLoader = new \Doctrine\Common\ClassLoader('Entities', realpath(__DIR__ . '/../../library/MyApp')); 
$classLoader->register(); 
$classLoader = new \Doctrine\Common\ClassLoader('Proxies', realpath(__DIR__ . '/../../library/MyApp')); 
$classLoader->register(); 

$config = new \Doctrine\ORM\Configuration(); 
$config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache); 
$driverImpl = $config->newDefaultAnnotationDriver(array(realpath(__DIR__."/../../library/MyApp/Entities"))); 
$config->setMetadataDriverImpl($driverImpl); 

$config->setProxyDir(realpath(__DIR__."/../../library/MyApp/Entities")); 
$config->setProxyNamespace('Proxies'); 

$connectionOptions = array(
    'driver' => 'pdo_sqlite', 
    'path' => 'database.sqlite' 
); 

$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config); 

$helpers = array(
    'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()), 
    'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em) 
); 

doctrine.php

<?php 

require_once '../../library/Doctrine/Common/ClassLoader.php'; 

$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\ORM', realpath(__DIR__ . '/../../library')); 
$classLoader->register(); 
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\DBAL', realpath(__DIR__ . '/../../library')); 
$classLoader->register(); 
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine\Common', realpath(__DIR__ . '/../../library')); 
$classLoader->register(); 
$classLoader = new \Doctrine\Common\ClassLoader('Symfony', realpath(__DIR__ . '/../../library/Doctrine')); 
$classLoader->register(); 
$classLoader = new \Doctrine\Common\ClassLoader('Entities', realpath(__DIR__ . '/../../library/MyApp')); 
$classLoader->register(); 
$classLoader = new \Doctrine\Common\ClassLoader('Proxies', realpath(__DIR__ . '/../../library/MyApp')); 
$classLoader->register(); 

// Variable $helperSet is defined inside cli-config.php 
require __DIR__ . '/cli-config.php'; 

$cli = new \Symfony\Component\Console\Application('Doctrine Command Line Interface', Doctrine\Common\Version::VERSION); 
$cli->setCatchExceptions(true); 
$helperSet = $cli->getHelperSet(); 
foreach ($helpers as $name => $helper) { 
    $helperSet->set($helper, $name); 
} 
$cli->addCommands(array(
    // DBAL Commands 
    new \Doctrine\DBAL\Tools\Console\Command\RunSqlCommand(), 
    new \Doctrine\DBAL\Tools\Console\Command\ImportCommand(), 

    // ORM Commands 
    new \Doctrine\ORM\Tools\Console\Command\ClearCache\MetadataCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\ClearCache\ResultCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\ClearCache\QueryCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\SchemaTool\CreateCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\SchemaTool\DropCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\EnsureProductionSettingsCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\ConvertDoctrine1SchemaCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\GenerateRepositoriesCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\GenerateEntitiesCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\GenerateProxiesCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\ConvertMappingCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\RunDqlCommand(), 
    new \Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand(), 

)); 
$cli->run(); 

唯一の違いは、私がベースの非稼働サンドボックスのためのすべてのエンティティの名前を変更していることですon Zend Framework命名規則:

だから、

<?php 

namespace Entities; 

/** @Entity @Table(name="addresses") */ 
class MyApp_Entities_Address 
{ 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** @Column(type="string", length=255) */ 
    private $street; 
    /** @OneToOne(targetEntity="MyApp_Entities_User", mappedBy="address") */ 
    private $user; 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function getStreet() 
    { 
     return $this->street; 
    } 

    public function setStreet($street) 
    { 
     $this->street = $street; 
    } 

    public function getUser() 
    { 
     return $this->user; 
    } 

    public function setUser(MyApp_Entities_User $user) 
    { 
     if ($this->user !== $user) { 
      $this->user = $user; 
      $user->setAddress($this); 
     } 
    } 
} 

User.php

<?php 

namespace Entities; 

/** @Entity @Table(name="users") */ 
class MyApp_Entities_User 
{ 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** @Column(type="string", length=50) */ 
    private $name; 
    /** 
    * @OneToOne(targetEntity="MyApp_Entities_Address", inversedBy="user") 
    * @JoinColumn(name="address_id", referencedColumnName="id") 
    */ 
    private $address; 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function getName() 
    { 
     return $this->name; 
    } 

    public function setName($name) 
    { 
     $this->name = $name; 
    } 

    public function getAddress() 
    { 
     return $this->address; 
    } 

    public function setAddress(MyApp_Entities_Address $address) 
    { 
     if ($this->address !== $address) { 
      $this->address = $address; 
      $address->setUser($this); 
     } 
    } 
} 

、私が間違って何をしましたか?どこでも問題なく./doctrine orm:run-dqlを実行できるように修正できますか?

答えて

0

はAddress.php

<?php 

//namespace Entities; 

/** @Entity @Table(name="addresses") */ 
class MyApp_Entities_Address 
{ 

ユーザーnamespace Entities

を削除しました。 PHP

<?php 

//namespace Entities; 

/** @Entity @Table(name="users") */ 
class MyApp_Entities_User 
{ 
その後、

そして、

$classLoader = new \Doctrine\Common\ClassLoader('MyApp_Entities', realpath(__DIR__ . '/../../library')); 
$classLoader->setNamespaceSeparator('_'); 
$classLoader->register(); 

最後に、私はエラーなしで走ったこのDQLを使用使用してそれをロードします。

$ ./doctrine orm:run-dql "SELECT a FROM MyApp_Entities_Address a" 
0

./doctrine orm:validate-schema 

を実行すると、[OK]をされていないときは、FAILを取得... - >それを引き起こしているものを確認してください。 Doctrineのメーリングリストで、ユーザーからいくつかのアイデアを、私はいくつかのコードを変更したし、それが働い

+0

エラーメッセージは非常に有用ではない、あなたはどのように上の任意のアイデアを持っているかをエラーに関する追加メッセージが表示されますか? – amree

+1

これはあなたのdoctrineスキーマ(フォルダEntitiesのphpファイルで定義されています)のように見えますが、あなたのDBで利用可能なものは一致しません。 – udo

+0

私もそれを憶えていますが、問題はすべてをチェックしたことです(おそらく私は何かが恋しくなりました)が、私のデータベースは自分のエンティティと同じようです。私はDoctrineのチケットを実際に開いたので、もっと役に立つメッセージ(同期していない場所など)を入れることを望んでいました。 – amree

関連する問題