誰も私の前の質問に答えなかったので、私はドクトリンサンドボックス自体の問題を再現することにしました。 。 (作業と非稼働のための)./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.php
と
doctrine.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
を実行できるように修正できますか?
エラーメッセージは非常に有用ではない、あなたはどのように上の任意のアイデアを持っているかをエラーに関する追加メッセージが表示されますか? – amree
これはあなたのdoctrineスキーマ(フォルダEntitiesのphpファイルで定義されています)のように見えますが、あなたのDBで利用可能なものは一致しません。 – udo
私もそれを憶えていますが、問題はすべてをチェックしたことです(おそらく私は何かが恋しくなりました)が、私のデータベースは自分のエンティティと同じようです。私はDoctrineのチケットを実際に開いたので、もっと役に立つメッセージ(同期していない場所など)を入れることを望んでいました。 – amree