首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当您不知道对象的父对象是否存在时,如何保存对象?

当您不知道对象的父对象是否存在时,如何保存对象?
EN

Stack Overflow用户
提问于 2012-07-18 23:43:44
回答 1查看 222关注 0票数 4

我有三张桌子,

代码语言:javascript
代码运行次数:0
运行
复制
Business:
  id
  name
Office:
  id
  name
  business_id
Employee:
  id
  name
  office_id

员工的外键是office_id,办公室的外键是business_id。

我有一个与之相关的域对象/实体和一个与之相关的数据库映射器对象。

现在,当我提供了业务名称、办公室名称和员工名称时,如何插入新员工?

最初,我认为逻辑应该是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
$businessMapper = new businessMapper();  
$business = $businessMapper->findBusinessByName($business_name);

if ($business == false) {   
     $business = new businessEntity(array(         
                     'businessName' => $business_name,            
                   ));        
     $businessMapper->save($business);   
  } 

 $officeMapper = new officeMapper();     
 $office = $officeMapper->getOfficeByName($office_name, $business);

.......etc.......

但后来我意识到,如果我必须拯救一家新企业,我就没有办法拥有一间办公室或一名员工,因此试图获得它们是一种浪费的查询。所以我想我应该创建一个if/else结构。

代码语言:javascript
代码运行次数:0
运行
复制
get business entity by business_name  
if ($business == false) {
    create business entity
    save business entity
    create office entity
    save office entity
    create employee entity
    save employee entity
} else {
   get office entity by office_name + business_id

   if (office == false) {
     create office entity
     save office entity
     create employee entity
     save employee entity

   } else {

     ......etc......
   }

}

但是有这么多重复的逻辑,而且它非常不可伸缩/肮脏。

那么,应该如何实现呢?

其次,逻辑应该走向何方?它应该放在employee的映射器中吗?或者是“添加员工”操作的控制器,还是应该有一个新的模型?

我使用Zend作为我的框架,但我认为这个问题适用于所有MVC风格的结构,所以无论您的框架偏好如何,请随时回答:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-19 07:02:00

如果在if()代码块中使用OR语句,并将查询放在If语句中,那么只有当if语句的第一部分失败时,才会执行该语句-确保您不需要执行不必要的查询。就我个人而言,我们做了一些类似的事情,但当我们创建一个新的域时,我们在域new=1中设置了一个标志,并且我们进行了检查,相同的方法只是消除了对这些脏变量的需要;-)

代码语言:javascript
代码运行次数:0
运行
复制
$businessMapper = Factory::getMapper('business');

if (!$business = $businessMapper->findByName("Business Name"))
{
    $business = $businessMapper->create();
    $business->setName("Business Name");
    $businessMapper->save($business);

    $newBusiness = true;
}

$officeMapper = Factory::getMapper('office');

if (isset($newBusiness) || !$office = $officeMapper->findByName("Office Name"))
{
    $office = $officeMapper->create();
    $office->setName("Office Name");
    $office->setBusiness($business->getId());
    $officeMapper->save($office);

    $newOffice = true;
}

$employeeMapper = Factory::getMapper('employee');

if (isset($newOffice) || !$employee = $employeeMapper->findByName("Employee"))
{
    $employee = $employeeMapper->create();
    $employee->setName("Employee Name");
    $employee->setOffice($office->getId());

    $employeeMapper->save($employee);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11545207

复制
相关文章

相似问题

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