2012-03-26 38 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

相關問題