一个简单的问题。在我的代码中
客户有很多合作伙伴。如果我想获得客户详细信息并且客户有多少合作伙伴。我想做的是,
$customer = Customer::get();
return Partners::get()->filter('CustomerID', $customer->ID);
不幸的是,上面的代码对我来说不起作用,有没有简单的方法可以获得。
答案 0 :(得分:1)
@Mifas你仍然得到错误,因为$ customer = Customer :: get()仍然返回一个DataList而不是一个Customer对象,正如@Zauberfisch所描述的那样。在调用关系方法之前,您需要确保在单个客户上调用它。
$customer = Customer::get()->first();
// OR, if you're looking up a specific Customer
$customer = Customer::get()->filter('ID', <custID>)->first();
// If you're looking up by ID only, there is a shortcut that still returns one dataobject only:
$customer = Customer::get()->byID( <custID> );
在这种情况下,以下任一行都可以使用(但是'魔术'方法@Zauberfisch指出的关系是首选方法)
$partners = $customer->Partners();
// OR
$partners = Partner::get()->filter('CustomerID', $customer->ID);
答案 1 :(得分:1)
如果您与客户和合作伙伴之间存在has_many关系,您应该只需通过Customer :: get()获得所有客户;并使用ORM进行内省。
然后,您有2个选项可以访问他们拥有多少合作伙伴。
1)使用ORM!假设您的关系被命名为“合作伙伴”。在循环访问Customer :: get()的PHP中,您可以访问“ - &gt; Partners() - &gt; Count();”对于每条记录。
foreach(Customer::get() as $customer){
echo $customer->Partners()->Count();
}
2)或者如果您只是在模板中需要这个,因为Zauberfisch提到您可以通过客户进行模板循环并使用点符号访问合作伙伴的数量。
<% loop Customers %>
$Partners.Count
<% end_loop %>
答案 2 :(得分: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)。 所以,如果客户有__伙伴,那么:
$partners = $customer->Partners();
或在模板中:
<% loop $Partners %> ... <% end_if %>
在此处阅读有关SilverStripe数据模型的更多信息: http://doc.silverstripe.com/framework/en/topics/datamodel