2014-04-06 30 views
1

一個簡單的問題。在我的代碼中SilverStripe:如何使用get()獲取所有記錄

客戶有很多合作伙伴。如果我想獲取客戶詳細信息,並且客戶擁有多少合作伙伴。我試圖做的是,

$customer = Customer::get(); 
return Partners::get()->filter('CustomerID', $customer->ID); 

不幸的是上面的代碼不工作對我來說,有沒有什麼簡單的方法來獲得。?

回答

0

第一個問題是您需要了解::get()如何工作。
::get()返回一個DataList對象,即使它只找到1個項目,它仍然是一個帶有DataObject的列表,所以你需要獲取DataObject。

如果你確定它只包含1項,那麼你可以簡單地做$customer Customer::get()->First()
但在你的情況下,我很確定Customer::get()將包含所有客戶。

所以它更像是$customers = Customer::get();

得到你想要的單一客戶依賴於你的代碼。


現在到您的實際問題:

return Partners::get()->filter('CustomerID', $customer->ID); 

實際上是正確的,這是可行的。但有一個更好的方法來做到這一點。
SilverStripe爲關係創建'魔術'方法(has_one,has_many和many_many)。 因此,如果客戶的has_many合作伙伴,那麼:

$partners = $customer->Partners(); 

或模板:

<% loop $Partners %> ... <% end_if %> 

閱讀更多關於SilverStripe數據模型在這裏: http://doc.silverstripe.com/framework/en/topics/datamodel

+0

感謝您的回答,現在清楚了,這是我的代碼,'$ customer = Customer :: get(); return $ customer-> Partners();'現在即時通訊出錯了? – Mifas

1

@Mifas你仍然得到錯誤因爲$ customer = Customer :: get()仍然返回一個DataList而不是一個Customer對象,就像@Zauberfisch所描述的那樣。在您調用關係方法之前,您需要確保您在單個客戶上調用它。

​​

在這種情況下,無論是以下行會的工作(但關係「魔力」的方法@Zauberfisch指出的是首選方法)

$partners = $customer->Partners(); 
// OR 
$partners = Partner::get()->filter('CustomerID', $customer->ID); 
+0

謝謝,現在我將我的代碼修改爲'$ customer = Customer :: get();返回HostingContract :: get() - > filter('CustomerID',$ customer-> ID);'那我現在怎麼得到記錄。 ? – Mifas

+0

您需要將 - > first()添加到Customer :: get(),或者您仍然獲得DataList而不是DataObject。 – dizzystuff

+0

啊,,不,不,我想要的是,我需要得到所有的客戶記錄和他們得到的合作伙伴的數量。 – Mifas

1

如果你有客戶之間的關係的has_many和合作夥伴,您應該能夠通過Customer :: get()獲得所有客戶;並使用ORM進行反思。

然後,您有2個選項可以訪問他們擁有的合作伙伴數量。

1)使用ORM!假設你的關係被命名爲「合作伙伴」。在您的PHP中,當您循環訪問Customer :: get()時,您可以訪問「 - > Partners() - > Count();」爲每個記錄。

foreach(Customer::get() as $customer){ 
    echo $customer->Partners()->Count(); 
} 

2),或者如果你只需要這在你的模板Zauberfisch提到你可以做一個模板循環thorugh您的客戶和使用點符號訪問合作伙伴的數量。

<% loop Customers %> 
    $Partners.Count 
<% end_loop %>