我有一个表单可以将用户插入到数据库中,这需要一次更新两个表,用户表和 user_role_linker 表。我正在使用hydrator(ClassMethod)来映射我的实体与相关表。我使用两个单独的实体,用户和 UserRole 。该表单包含使用用户表和用户角色字段映射的所有用户字段,以与 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水合器找到连接表。
请帮助我完成此任务。
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;
}
}