我有一个将用户插入数据库的表单,它需要更新两个表@一次,用户表和user_role_linker表。我正在使用 hydrator (ClassMethod) 将我的实体与相关表进行映射。我使用两个单独的实体,User和UserRole。该表单包含与User表映射的所有用户字段和与user_role_linker表映射的用户角色字段。提交表单后,将表单与用户实体绑定。
$user = new \ZfcUser\Entity\User();
$form = $this->getRegisterForm();
$form->setHydrator($this->getFormHydrator());
$form->bind($user);
$user = $form->getData();
插入分两步进行。
$this->getUserMapper()->insert($user);
$user_role_linker->setId($user->getId());
$user_role_linker->setRoleId($data['user_role']);
$this->getUserRoleLinkMapper()->insert($user_role_linker);
首先插入用户并返回user_id,然后在UserRole实体中设置user_id和user_role并插入到表中。
但是现在的问题是将两个表提取到一个对象或一个数组中。我可能需要执行表连接才能获得解决方案。但是我找不到使用 ClassMethod hydrator 加入表格的方法。
请帮我完成这个。
UserHydrator 类
namespace ZfcUser\Mapper;
use Zend\Stdlib\Hydrator\ClassMethods;
use ZfcUser\Entity\UserInterface as UserEntityInterface;
class UserHydrator extends ClassMethods
{
/**
* Extract values from an object
*
* @param object $object
* @return array
* @throws Exception\InvalidArgumentException
*/
public function extract($object)
{
if (!$object instanceof UserEntityInterface) {
throw new Exception\InvalidArgumentException('$object must be an instance of ZfcUser\Entity\UserInterface');
}
/* @var $object UserInterface*/
$data = parent::extract($object);
$data = $this->mapField('id', 'user_id', $data);
//$data = $this->mapField('id', 'username', $data);
return $data;
}
/**
* Hydrate $object with the provided $data.
*
* @param array $data
* @param object $object
* @return UserInterface
* @throws Exception\InvalidArgumentException
*/
public function hydrate(array $data, $object)
{
if (!$object instanceof UserEntityInterface) {
throw new Exception\InvalidArgumentException('$object must be an instance of ZfcUser\Entity\UserInterface');
}
$data = $this->mapField('user_id', 'id', $data);
return parent::hydrate($data, $object);
}
protected function mapField($keyFrom, $keyTo, array $array)
{
$array[$keyTo] = $array[$keyFrom];
unset($array[$keyFrom]);
return $array;
}
}