2012-03-26 32 views
0

让我起初说我们使用php和postgre数据库。在我们的项目中,我们决定不使用任何ORM,因为它的SQL查询超载,我们正在采取相反的方式。php:将一个多选择分为几个对象/对象结构

想象一下你有几个表中的选择,让我们说在ID列上加入。例如:

  • 表:用户(ID,姓名),项目(编号,名称,描述),评论(USER_ID,ITEM_ID,文本,评级)

所以基本上你有一个表用户,一些项目的表格以及与一个用户和一个项目相关的评论表格。

您创建两个对象 - 表示其表格行的用户和项目。然后你想创建一个评论对象。在一个ORM中,它将包含对象用户和项目,并且他们会加载自己的查询,但这将是两个查询,并且您在考虑......但是我可以用一个查询来选择这些数据......但是如何?

试想一下,你有这样的选择:

  • SELECT * FROM comments JOIN users ON comments.user_id = users.id JOIN items ON comments.item_id = items.id

(你也能想象一个WHERE与指定项ID或用户ID等条款)

那么你会如何拆分这样的选择到这类结构的结果,可以说你想评论的对象的列表:

  • 用户
  • 项目
  • 评论(包含用户和项目的对象引用)

到目前为止,我们的理论解决方案是用固定前缀的前缀列的名字:),然后传播的结果进入对象结构和每个对象都会从选择中获取所需的内容。其他解决方案?让我们说更复杂?

感谢您的任何想法

PS:很明显,我已经用了一个很简单的例子,但试着想象,这个问题是远远更大,结构更复杂

回答

1

首先,你可能会受益从看Data Mapper模式。一个简单的用例与看起来像这样:

$user = new User; 
$mapper = new UserMapper($db); 
$user->setName('foobar'); 
$mapper->fetch($user); 
if ($user->isBanned()) 
{ 
    throw new Exception('get out !'); 
} 
$user->setLastActive(time()); 
$mapper->store($user); 

至于数据单查询:这不是重要的组成部分。你只需ALIAS它按要求(哦..我希望你没有使用*选择行)。重要的是从选定的数据创建一个对象图。你在哪里使用建设者/工厂。

//the rest of PDO-related code 
$data = $statement->fecth(PDO::FETCH_ASSOC); 
$comment = $commentFactory->build($data); 

$commentFactoryCommentFactory实例:

class CommentFactory 
{ 
    public function build($params) 
    { 

     $author = new User; 
     $subject = new Item; 
     $comment = new Comment($author, $subject); 

     $author->setId($params['user_id']); 
     $author->setName($params['user_name']); 

     $subject->setId($param['item_id']); 

     $comment->setContent($param['content']); 

     return $comment; 
    } 
} 

此外,像这样的设置,你可以很容易地改变$comment是怎么做,只是通过改变什么类是$commentFactory的一个实例。

+0

别担心,我不会在选择语句中使用*。我只懒得写出示例或任何子集中的每一列。谢谢你,这就是我所做的,甚至更多。 – Santhos 2012-03-26 11:47:22

相关问题