2012-08-01 86 views
1

我有兩個實體。首先被稱爲「狀態」:Symfony 2&Doctrine 2:複雜的關係beetwen實體

<?php 
class Status { 
    protected $id; 
    protected $type = null; // standarized type of status (f.e. "locked", "disabled") 
    protected $value = true; // true or false (value of status) 
    protected $change_reason = null; 
    protected $changed_by; 
    protected $changed_at; 
} 

我已經清除註解以提高可讀性。

而第二個叫做例如。帳戶。因爲帳戶不是唯一使用狀態的實體,所以狀態和任何其他「有狀態的」實體(我認爲)應該是多對多的。對於帳戶,將有連接表account_status等

另外一個狀態只屬於一個實體。

這一切都適用於該配置,但我真的不知道如何檢索具有最新狀態的帳戶列表。

我寫了一個SQL查詢來檢索實際狀態:

SELECT * FROM (
    SELECT t.type, t.value 
    FROM status AS t 
    ORDER BY t.changed_at DESC 
) AS t1 GROUP BY t1.type 

我的問題是:

  1. 是這種想法正確的呢?
  2. 如何檢索包含所有最新狀態的帳戶列表?

對不起,我可憐的英語。

編輯: 我只想得到一個帳號,加入其最新的狀態,然後讓他們乾脆:$任務 - >的getStatus(「突出」)來獲得的最新的(最小的)狀態的值類型的「突出」

EDIT2: 理想會被給定類型的狀態來還是要排序的能力和過濾

+0

您可以將lastStatus關係添加到每個帳戶 – WizardZ 2012-08-01 17:13:10

+0

每個帳戶可以有多個狀態,例如。 「鎖定」,「過期」等...更好的例子是一個任務 - 「關閉」,「突出顯示」。 – Krystian 2012-08-01 17:43:28

回答

1
class Task { 

    // this is list of all statuses 
    protected $statusHistory; 

    protected $lastStatus; 

    public function __construct() { 
     $this->statusHistory = new Arraycollection(); 
    } 

    public function addStatus($status) { 
     $this->statusHistory[] = $status; 
     $this->lastStatus = $status; 
    } 

    public function getStatusHistory() { 
     return $this->statusHistory; 
    } 

    public function getLastStatus() { 
     return $this->lastStatus; 
    } 
} 

// to get list of statuses 
$task->getStatusHistory(); 

// to get last status, it returns Status object, not collection 
$task->getLastStatus(); 

這或多或少標準的方法,當你需要從第一/最後一個元素COLLEC重刑和整個收集可能是一個開銷。

+0

這不是我所需要的。我只想獲得一個帳戶,加入其最新狀態,然後簡單地通過以下方式獲取它們: $ task - > getStatus('highlight') 以獲取「突出顯示」類型的最新狀態值。 – Krystian 2012-08-02 15:44:00