首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理论2与垂直划分

理论2与垂直划分
EN

Stack Overflow用户
提问于 2014-12-10 08:33:51
回答 1查看 1K关注 0票数 0

我目前正在从事一个项目,为此我必须处理许多用户字段(+/- 80)。我的第一种方法是(现在仍然是)将用户表垂直划分为4个表:主信息、管理信息、银行信息、统计信息。三个额外表行的id引用主表的自动递增id。

我的问题是:

  1. 这样做有关系吗?
  2. 看起来,按照我的方法,Doctrine无法一次性地将一个对象刷新到数据库中:

MyVendor\User\UserBundle\Entity\UsersInfosBank类型的实体缺少为字段“ID _user”分配的id。该实体的标识符生成策略要求在调用EntityManager#persist()之前填充ID字段。如果希望自动生成标识符,则需要相应地调整元数据映射。

该项目将在3周内投入生产,因此我们仍然能够回到一种更传统的方法,将这些数据存储到一个巨大的表…中

*更新*

整个代码逻辑如下*

我刚刚删除了大多数与问题…无关的属性和方法

是的,我正在使用FOSUserBundle ;)

UsersMain

代码语言:javascript
运行
复制
<?php

namespace LCP\User\UserBundle\Entity;

use FOS\UserBundle\Model\GroupableInterface;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * UsersMain
 *
 * @ORM\Table(name="lcp_users_main")
 * @ORM\Entity
 */
class UsersMain extends BaseUser 
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;


    /**
     *
     * @ORM\OneToOne(targetEntity="LCP\User\UserBundle\Entity\UsersInfosBank", mappedBy="id_user", cascade={"persist"})
     */
    private $infosBank;

    /**
     *
     * @ORM\OneToOne(targetEntity="LCP\User\UserBundle\Entity\UsersApodis", mappedBy="id_user", cascade={"persist"})
     */
    private $apodis;

    /**
     *
     * @ORM\OneToOne(targetEntity="LCP\User\UserBundle\Entity\UsersInfosAdmin", mappedBy="id_user", cascade={"persist"})
     */
    private $infosAdmin;

    /**
     *
     * @ORM\OneToOne(targetEntity="LCP\User\UserBundle\Entity\UsersInfosStats", mappedBy="id_user", cascade={"persist"})
     */
    private $infosStats;



    /**
     * Constructor
     */
    public function __construct()
    {
        $this->groups = new \Doctrine\Common\Collections\ArrayCollection();
        $this->creationDate = new \Datetime();
    }

    /**
     * Set apodis
     *
     * @param \LCP\User\UserBundle\Entity\UsersApodis $apodis
     * @return UsersMain
     */
    public function setApodis(\LCP\User\UserBundle\Entity\UsersApodis $apodis = null)
    {
        if(is_null($this->apodis) && is_null($apodis)){
            $this->apodis = new \LCP\User\UserBundle\Entity\UsersApodis();
        } else {
            $this->apodis = $infosBank;
        }

        $this->apodis->setIdUser($this);

        return $this;
    }

    /**
     * Get apodis
     *
     * @return \LCP\User\UserBundle\Entity\UsersApodis 
     */
    public function getApodis()
    {
        if(is_null($this->infosAdmin)){
            $this->infosAdmin = new \LCP\User\UserBundle\Entity\UsersApodis();
        }
        return $this->apodis;
    }

    /**
     * Set infosAdmin
     *
     * @param \LCP\User\UserBundle\Entity\UsersInfosAdmin $infosAdmin
     * @return UsersMain
     */
    public function setInfosAdmin(\LCP\User\UserBundle\Entity\UsersInfosAdmin $infosAdmin = null)
    {
        if(is_null($this->infosAdmin) && is_null($infosAdmin)){
            $this->infosAdmin = new \LCP\User\UserBundle\Entity\UsersInfosAdmin();
        } else {
            $this->infosAdmin = $infosAdmin;
        }

        $this->infosAdmin->setIdUser($this);

        return $this;
    }

    /**
     * Get infosAdmin
     *
     * @return \LCP\User\UserBundle\Entity\UsersInfosAdmin 
     */
    public function getInfosAdmin()
    {
        if(is_null($this->infosAdmin)){
            $this->infosAdmin = new \LCP\User\UserBundle\Entity\UsersInfosAdmin();
        }
        return $this->infosAdmin;
    }

    /**
     * Set infosStats
     *
     * @param \LCP\User\UserBundle\Entity\UsersInfosStats $infosStats
     * @return UsersMain
     */
    public function setInfosStats(\LCP\User\UserBundle\Entity\UsersInfosStats $infosStats = null)
    {
        if(is_null($this->infosStats) && is_null($infosStats)){
            $this->infosStats = new \LCP\User\UserBundle\Entity\UsersInfosStats();
        } else {
            $this->infosStats = $infosAdmin;
        }

        $this->infosStats->setIdUser($this);

        return $this;
    }

    /**
     * Get infosStats
     *
     * @return \LCP\User\UserBundle\Entity\UsersInfosStats 
     */
    public function getInfosStats()
    {
        if(is_null($this->infosStats)){
            $this->infosStats = new \LCP\User\UserBundle\Entity\UsersInfosStats();
        }
        return $this->infosStats;
    }



}

UsersInfosAdmin

代码语言:javascript
运行
复制
<?php

namespace LCP\User\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * UsersInfosAdmin
 *
 * @ORM\Table(name="lcp_users_infos_admin", indexes={@ORM\Index(name="pharmacyCip_idx", columns={"pharmacy_cip"})})
 * @ORM\Entity
 */
class UsersInfosAdmin
{

    /**
     * @var integer
     * @ORM\Id
     * @ORM\OneToOne(targetEntity="LCP\User\UserBundle\Entity\UsersMain", cascade={"persist"}, inversedBy="infosAdmin")
     */
    private $id_user;


    /**
     * Set id_user
     *
     * @param \LCP\User\UserBundle\Entity\UsersMain $idUser
     * @return UsersInfosAdmin
     */
    public function setIdUser(\LCP\User\UserBundle\Entity\UsersMain $idUser)
    {
        $this->id_user = $idUser;

        return $this;
    }

    /**
     * Get id_user
     *
     * @return \LCP\User\UserBundle\Entity\UsersMain 
     */
    public function getIdUser()
    {
        return $this->id_user;
    }
}

UsersInfosStats

代码语言:javascript
运行
复制
<?php

namespace LCP\User\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * UsersInfosStats
 *
 * @ORM\Table(name="lcp_users_infos_stats")
 * @ORM\Entity
 */
class UsersInfosStats
{
    /**
     * @var integer
     * @ORM\Id
     * @ORM\OneToOne(targetEntity="LCP\User\UserBundle\Entity\UsersMain", cascade={"persist"}, inversedBy="infosStats")
     */
    private $id_user;

    /**
     * Set id_user
     *
     * @param \LCP\User\UserBundle\Entity\UsersMain $idUser
     * @return UsersInfosStats
     */
    public function setIdUser(\LCP\User\UserBundle\Entity\UsersMain $idUser)
    {
        $this->id_user = $idUser;

        return $this;
    }

    /**
     * Get id_user
     *
     * @return \LCP\User\UserBundle\Entity\UsersMain 
     */
    public function getIdUser()
    {
        return $this->id_user;
    }
}

下面是我如何创建一个用户(通过一个安全的管理区域表单):

代码语言:javascript
运行
复制
/**
* This action get the field from the form
*/
public function userSaveAction(Request $request)
{
    $userManager = $this->get('fos_user.user_manager');
    $this->request = $request;
    $userValues = $this->getRequest()->request->all();
    $this->em = $this->getDoctrine()->getManager();

    $user = $this->processUser($userValues);

    $userManager->updateUser($user, false);

    return $this->redirect($this->generateUrl('lcp_admin_user_edit', ['id'=>$user->getId()]));
}

/**
* This method process user fields and uses setters (or getters for joined entities) to set datas of user
*/
private function processUser($userValues)
{
    if($userValues['userId']=="") {
        $user = $this->get('fos_user.user_manager')->createUser();
    } else {
        $user = $this->em->getRepository('LCPUserBundle:UsersMain')
                ->findOneBy(['id' => $userId]);
    }

    //construction of related entities
    $user->setInfosAdmin();
    $user->setInfosBank();
    $user->setInfosStats();
    $user->setApodis();

    unset($userValues['userId']);

    //this method inspect submitted field to check if they are mandatory or if current user is allowed to modify them
    $this->fields = $this->getInfosFields();

    foreach($userValues as $input=>$value){
        list($entity,$input)=explode('-',$input);
        if($input=='plainPassword' && $value==''){
            continue;
        }
        if($entity=='Main'){
            $setter = 'set'.ucfirst($input);
            $user->$setter($value);
        } else {
            $setter = 'set'.ucfirst($input);
            $join = 'get'.$entity;

            $user->$join()->$setter($value);
        }
    }
    return $user;
}
EN

回答 1

Stack Overflow用户

发布于 2014-12-10 11:37:41

根据注释,您的UsersMain属性需要如下所示:

代码语言:javascript
运行
复制
/**
 * Join administrative informations
 * @ORM\OneToOne(targetEntity="MyVendor\User\UserBundle\Entity\UsersInfosAdmin", mappedBy="userMain", cascade={"persist"}, orphanRemoval=true)
 */
private $infosAdmin;

/**
 * Setter InfosAdmin
 */
public function setInfosAdmin(UsersInfosAdmin $infosAdmin)
{
    $this->infosAdmin = $infosAdmin;
    $this->infosAdmin->setUserMain($this); <--- add this to set userMain on associated object

    return $this;
}

那么您的UsersInfosAdmin属性需要如下所示:

代码语言:javascript
运行
复制
/**
 * @var integer
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
 private $id;

/**
 * @ORM\OneToOne(targetEntity="MyVendor\User\UserBundle\Entity\UsersMain", inversedBy="userMain")
 */
 private $userMain;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27396405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档