2013-03-25 71 views
1

我在想這樣的問題......比方說,我們有一個類人:迭代器上的MySQL使用對象

class Person { 
    private $iPersonId; 
    private $sName; 
    private $sLastName; 
    private $rConn; 


public function __construct($rConn, $iPersonId) { 
$this->rConn = $rConn; 
$this->iPersonId = $iPersonId; 
} 

    public function load() { 
     // load name and last name using the $rConn object and $iPersonId 
    } 
    } 

,現在我們要對許多人執行一些操作,所以我們寫一個新的類:

class People { 

private $aPeople = array(); 

public function addPerson(Person $oPerson) { 
// ... 
} 

public function loadPeople() { 
// PROBLEM HERE // 
} 

} 

現在有兩個問題:1。 人員和人民有裝載相同的接口(函數的load()),但如果我想通過$ aPeople的人重複,以然後加載它們的數據本會導致以下問題:

SELECT * FROM people WHERE id = 1 
SELECT * FROM people WHERE id = 2 
SELECT ...... 
..... 
.... 

如果想要加載1000,那麼一些東西會去繁榮:)。

如何設計此代碼以在一個查詢中加載所有用戶? (IN)

  1. 我必須在我添加到People中的每個Person對象中繼續使用依賴注入。這違背了DRY規則,只是看起來不太好。

所以親愛的用戶,有什麼更好的方法來設計這個代碼?

+0

什麼的'loadPeople()'的內容? – scones 2013-03-25 10:16:03

+0

foreach($ aPeople as $ oPerson) – 2013-03-25 10:18:51

+0

{$ oPerson-> load()} – 2013-03-25 10:19:31

回答

0

我會建議人們加載大部分人的靜態方法。 這也需要您重寫構造函數,或添加其他方法來初始化其他數據。

class Person { 
    protected $_data 
    protected $rConn; 


    public function __construct($rConn, $iPersonId) { 
    $this->rConn = $rConn; 
    $this->_data = array(); 
    $this->_data['id'] = $iPersonId; 
    } 

    public function load() { 
    // load name and last name using the $rConn object and $iPersonId 
    } 

    // under the assumption, that $rConn is a mysqli connection 
    // if not rewrite the specific section 
    // also there is no injection protection or error handling in here 
    // this is just a workflow example, not good code! 
    public static function loadPeople($ids) { 
    $res = $rConn->query("select * from people where id in (" . implode(',', $ids) . ")"); 
    $people = array(); 
    while ($row = $res->fetch_assoc()) { 
     $p = new People($rConn, $row['id']); 
     $p->setData($row); 
     $people[] = $p; 
    } 
    $res->free(); 
    return $people; 
    } 

    public function setData($data) { 
    foreach ($data as $key => $value { 
     $this->_data[key] = $value; 
    } 
    } 
} 
0

如果你建立一個服務作爲Symfony2中(http://symfony.com/doc/2.0/book/service_container.html),你可以添加方法。在「人」上加載「負載()」聽起來不太合適。它是什麼加載,本身?給對象或實體訪問數據庫也是一種不好的做法,這會導致不需要的依賴關係。

  • 您的實體或對象不應該有一個函數來加載自己,不好的做法。讓其他人管理實體或對象。
  • 不要造成混淆的依賴關係,將對象保留爲自己的目的。 PersonEntity不應該知道任何有關數據庫連接或EntityManager的信息
  • 構建您的代碼,以便您可以將其移動到另一個項目中,而不必中斷Composer。 http://getcomposer.org/

例如,我會怎麼做它的Symfony2

class PeopleService 
{ 
    private $em; 

    /** 
    * @param EntityManager $em 
    */ 
    public function __construct(EntityManager $em) 
    { 
    $this->em = $em; 
    } 

    /** 
    * @param int $id 
    * @return Person 
    */ 
    public function loadPerson($id) 
    { 
    // do something and return 1 person 
    return $this->em->find('MyBundleNamspace:Person', $id); 
    } 

    /** 
    * @return array of Person objects 
    */ 
    public function loadPeople() 
    { 
    // do something and return an array with persons 
    } 
}