この 1 週間ほど、Zend と Doctrine を組み込んで遊んでいます。基本的な挿入と選択のコツをつかみ、DQL を使用して結合されたテーブルから選択することもできます。私が抱えている問題は、関連付けられたエンティティを永続化することです。私が得ているエラーはこれです:(path)htdocs\vendor\doctrine\common\lib\Doctrine\Common\Persistence\Mapping\MappingException.php:96 with the message 'Class "" does not exist'.
私のコードは以下です...
これがメインエンティティです(「多」側のもの)
namespace Project\Entity;
use Doctrine\ORM\Mapping as ORM;
use Zend\InputFilter\Factory as InputFactory;
/**
* ClientUser
*
* @ORM\Table()
* @ORM\Entity
*/
class ClientUser extends SystemUser
{
/**
* @var integer
*
* @ORM\OneToOne(targetEntity="SystemUser", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="id", referencedColumnName="id")
*/
private $id;
/**
* @var integer
*
* @ORM\ManyToOne(targetEntity="Client", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="client", referencedColumnName="id")
*/
private $client;
protected $_inputFilter;
//Other stuff here...
}
これが「クライアント」関連エンティティです...
namespace Project\Entity;
use Doctrine\ORM\Mapping as ORM;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
/**
* Client
*
* @ORM\Table()
* @ORM\Entity
*/
class Client implements InputFilterAwareInterface
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="client_name", type="string", length=255)
*/
private $clientName;
/**
* @var integer
*
* @ORM\Column(name="loggable_hours", type="integer")
*/
private $loggableHours;
/**
* @var float
*
* @ORM\Column(name="normal_rate", type="decimal", scale=2)
*/
private $normalRate;
/**
* @var float
*
* @ORM\Column(name="critical_rate", type="decimal", scale=2)
*/
private $criticalRate;
/**
* @var string
*
* @ORM\Column(name="start_date", type="string")
*/
private $startDate;
/**
* @var boolean
*
* @ORM\Column(name="enabled", type="boolean")
*/
private $enabled;
/**
* @var integer
*
* @ORM\Column(name="critical_hours", type="integer")
*/
private $criticalHours;
/**
*
* @var type
*/
protected $_inputFilter;
//Other stuff (getters,setters, etc)
}
ClientUser には、次のものと 1 対 1 の関係があります。
namespace Project\Entity;
use Doctrine\ORM\Mapping as ORM;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
/**
* SystemUser
*
* @ORM\Table()
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="user_type", type="integer")
* @ORM\DiscriminatorMap({1 = "DeveloperUser", 2 = "ClientUser"})
*
*/
class SystemUser implements InputFilterAwareInterface {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="username", type="string", length=100, unique=true)
*/
private $username;
/**
* @var string
*
* @ORM\Column(name="password", type="string", length=255)
*/
private $password;
/**
* @var string
*
* @ORM\Column(name="user_first_name", type="string", length=255)
*/
private $userFirstName;
/**
* @var string
*
* @ORM\Column(name="user_surname", type="string", length=255)
*/
private $userSurname;
/**
* @ORM\Column(type="string", length=32)
*/
private $salt;
/**
* @var \DateTime
*
* @ORM\Column(name="last_login", type="datetime")
*/
private $lastLogin = '0000-00-00 00:00:00';
/**
* @var bool
*
* @ORM\Column(name="enabled", type="boolean", options={"default" = 1})
*/
private $enabled = 1;
/**
* For the input filter...
*
* @var InputFilter
*/
protected $_inputFilter;
//The rest...
}
ここで何が問題なのかまったくわかりません...完全を期すために、ここにコントローラーの「追加」アクションがあります...
public function addAction() {
//To add clients
$form = new ClientUserForm($this->getServiceLocator()
->get('Doctrine\ORM\EntityManager'));
$form->get('submit')->setValue('Add');
$request = $this->getRequest();
if ($request->isPost()) {
$clientUser = new ClientUser();
$form->setInputFilter($clientUser->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
$clientUser->populate($form->getData());
/**
*This bottom line is where I get the exception!
*/
$this->getEntityManager()->persist($clientUser);
$this->getEntityManager()->flush();
//Redirect
return $this->redirect()->toRoute('client_user');
}
}
return array ('form' => $form);
}
どんな助けでも素晴らしいでしょう!「」がどのクラスになるべきかを知っていれば、おそらく今よりも良い場所にいるでしょう! 紳士淑女の皆様、ありがとうございます。
編集-
これら 2 つの PHP 警告を追加するのを忘れていました...
警告: spl_object_hash() は、パラメーター 1 がオブジェクトであると想定し、1588 行目の (path)\htdocs\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php で指定された整数
警告: get_class() は、パラメーター 1 がオブジェクトであると想定します。1596 行目の (path)\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php で指定された整数です